基于深度學(xué)習(xí)的犬種識別軟件(YOLOv5清新界面版,Python代碼)
摘要:基于深度學(xué)習(xí)的犬種識別軟件用于識別常見多個犬品種,基于YOLOv5算法檢測犬種,并通過界面顯示記錄和管理,智能輔助人們辨別犬種。本文詳細(xì)介紹博主自主開發(fā)的犬種檢測系統(tǒng),在介紹算法原理的同時,給出Python的實現(xiàn)代碼、PyQt的UI界面及訓(xùn)練數(shù)據(jù)集。本系統(tǒng)在界面中可以選擇各種圖片、視頻進(jìn)行檢測識別;可對圖像中存在的多個目標(biāo)進(jìn)行識別分類,檢測速度快、識別精度高。博文提供了完整的Python代碼和使用教程,適合新入門的朋友參考,完整代碼資源文件請轉(zhuǎn)至文末的下載鏈接。

完整代碼下載:https://mbd.pub/o/bread/ZJaXlZ5r
參考視頻演示:https://www.bilibili.com/video/BV1aM4y1r7Qe/
離線依賴庫下載鏈接:https://pan.baidu.com/s/1hW9z9ofV1FRSezTSj59JSg?pwd=oy4n?(提取碼:oy4n )

前言
????????近年來深度學(xué)習(xí)技術(shù)不斷發(fā)展,有力推動了圖像目標(biāo)檢測任務(wù)在實際生活中的廣泛應(yīng)用。同時,隨著圖像分類理論體系的日益成熟,圖像分類研究己取得許多突破,朝著多場景、大范圍的方向進(jìn)行。不過,現(xiàn)今圖像分類工作大多集中在通用分類,比如區(qū)分人、車等多種不相關(guān)類別。在細(xì)粒度圖像分類,即對同一大類下的多個不同子類進(jìn)行識別方面的研究探索還很有限,逐漸成為當(dāng)下計算機(jī)視覺及其應(yīng)用中的研究熱點(diǎn)。本文著手于犬種目標(biāo)的精細(xì)化圖像分類,研究基于深度學(xué)習(xí)的犬種識別算法及系統(tǒng)應(yīng)用。針對犬種圖像中不同種類具有一定相似性與同種類間具有較大差異性等問題,從目標(biāo)檢測和特征融合的角度來研究犬種圖像的精細(xì)化分類算法,致力于提高對多個犬種種類的識別準(zhǔn)確度并實現(xiàn)簡要的應(yīng)用功能。
????????本系統(tǒng)基于YOLOv5算法實現(xiàn)犬種檢測識別基本任務(wù),采用登錄注冊進(jìn)行用戶管理,功能主界面可對圖片、視頻和攝像頭捕獲的實時畫面檢測犬種,系統(tǒng)支持結(jié)果記錄、展示和保存,每次檢測的結(jié)果記錄在表格中。對此這里給出博主設(shè)計的界面,同款的簡約風(fēng),功能也可以滿足圖片、視頻和攝像頭的識別檢測,希望大家可以喜歡,初始界面如下圖:

????????檢測類別時的界面截圖(點(diǎn)擊圖片可放大)如下圖,可識別畫面中存在的多個類別,也可開啟攝像頭或視頻檢測:

???????? 詳細(xì)的功能演示效果參見博主的B站視頻或下一節(jié)的動圖演示,覺得不錯的朋友敬請點(diǎn)贊、關(guān)注加收藏!系統(tǒng)UI界面的設(shè)計工作量較大,界面美化更需仔細(xì)雕琢,大家有任何建議或意見和可在下方評論交流。
1.?效果演示
????????軟件的顏值很重要,首先我們還是通過動圖看一下識別的效果,系統(tǒng)主要實現(xiàn)的功能是對圖片、視頻和攝像頭畫面中的犬種進(jìn)行識別,識別的結(jié)果可視化顯示在界面和圖像中,另外提供多個目標(biāo)的顯示選擇功能,演示效果如下。本系統(tǒng)界面上顯示的所有文字、圖標(biāo)、圖片均可自行修改,修改方式可見上面的視頻介紹。
(一)系統(tǒng)介紹
????????基于深度學(xué)習(xí)的犬種識別軟件主要用于常見犬種的智能檢測與識別,基于深度學(xué)習(xí)技術(shù)識別包括秋田犬、小獵犬、柯基等多個犬種,軟件自動輸出犬類目標(biāo)的標(biāo)記框坐標(biāo)和品種,以輔助人們辨別犬種。
(二)技術(shù)特點(diǎn)
???????? (1)檢測算法采用YoloV5目標(biāo)檢測算法識別犬種,模型支持更換;
???????? (2)攝像頭實時檢測,展示、記錄和保存犬種結(jié)果;
???????? (3)檢測圖片、視頻等圖像中的不同犬種;
???????? (4)支持用戶登錄、注冊、管理,界面縮放、可視化等功能;
???????? (5)提供數(shù)據(jù)集和訓(xùn)練代碼可重新訓(xùn)練;
(三)用戶注冊登錄界面
????????這里設(shè)計了一個登錄界面,可以注冊賬號和密碼,然后進(jìn)行登錄。界面還是參考了當(dāng)前流行的UI設(shè)計,左側(cè)是一個動圖,右側(cè)輸入賬號、密碼、驗證碼等等。

(四)選擇圖片識別
????????系統(tǒng)允許選擇圖片文件進(jìn)行識別,點(diǎn)擊圖片選擇按鈕圖標(biāo)選擇圖片后,顯示所有識別的結(jié)果,可通過下拉選框查看單個結(jié)果,以便具體判斷某一特定目標(biāo)。本功能的界面展示如下圖所示:

(五)視頻識別效果展示
????????很多時候我們需要識別一段視頻中的多個犬種,這里設(shè)計了視頻選擇功能。點(diǎn)擊視頻按鈕可選擇待檢測的視頻,系統(tǒng)會自動解析視頻逐幀識別多個犬種,并將犬種的分類和計數(shù)結(jié)果記錄在右下角表格中,效果如下圖所示:

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

2.?犬種檢測與識別
(一)基于YoloV5的犬種識別檢測
????????YoloV5在Conv模塊中封裝了三個功能:包括卷積(Conv2d)、Batch Normalization和激活函數(shù),同時使用autopad(k, p)實現(xiàn)了padding的效果。其中YOLOv5-6.0版本使用Swish(或者叫SiLU)作為激活函數(shù),代替了舊版本中的Leaky ReLU。
????????(1)網(wǎng)絡(luò)結(jié)構(gòu)
????????Backbone

????????YOLOv5-6.0版本的Backbone主要分為Conv模塊、CSPDarkNet53和SPPF模塊。
????????(2)Conv模塊

????????(3)Focus模塊
????????Focus模塊是YOLOv5舊版本中的一個模塊,它的結(jié)構(gòu)如下圖所示。

? ? ? ? 其中核心部分是對圖片進(jìn)行切片(slice)操作,并且在通道維度上進(jìn)行拼接。對于一張3通道的輸入圖片,分別在w和h兩個維度上,每隔一個像素取一個值,從而構(gòu)建得到12張?zhí)卣鲌D。因此Focus模塊不僅在減少信息丟失的情況下實現(xiàn)了2倍下采樣,而且減少了參數(shù)量(params)和計算量(FLOPs),降低了CUDA顯存的消耗,從而提升了前向和后向傳遞的速度。
????????(4)CSPDarkNet53
????????CSPNet被提出的主要目的是為了保證在模型檢測和識別精度沒有下降的情況下,減少計算量,提高推理速度,可參考論文(https://arxiv.org/abs/1911.11929),它的主要思想是通過分割梯度流,使梯度流通過不同的網(wǎng)絡(luò)路徑傳播。通過拼接和過渡等操作,從而實現(xiàn)更豐富的梯度組合信息。

? ? ? ? 以DenseNet為例,在將特征圖輸入到Dense_Block之前,將特征圖從通道維度上分為兩個部分:
????????其中一部分進(jìn)入Dense_Block中進(jìn)行計算,另一部分則通過一個shortcut與Dense_Block的輸出特征圖進(jìn)行拼接,最后將拼接后的特征圖輸入到Transition Layer進(jìn)行卷積操作。
????????(5)Bottleneck模塊
????????Bottleneck模塊借鑒了ResNet的殘差結(jié)構(gòu),其中一路先進(jìn)行1×1卷積將特征圖的通道數(shù)減小一半,從而減少計算量,再通過3×3卷積提取特征,并且將通道數(shù)加倍,其輸入與輸出的通道數(shù)是不發(fā)生改變的。而另外一路通過shortcut進(jìn)行殘差連接,與第一路的輸出特征圖相加,從而實現(xiàn)特征融合。

????????在YoloV5的Backbone中的Bottleneck都默認(rèn)使shortcut為True,而在Head中的Bottleneck都不使用shortcut。
????????(6)C3模塊
????????YOLOv4和YOLOv5均借鑒了CSPNet的思想,將其運(yùn)用于DarkNet53骨干網(wǎng)絡(luò)。YOLOv5-6.0版本中使用了C3模塊,替代了早期的BottleneckCSP模塊。

????????這兩者結(jié)構(gòu)作用基本相同,均為CSP架構(gòu),只是在修正單元的選擇上有所不同,C3模塊包含了3個標(biāo)準(zhǔn)卷積層以及多個Bottleneck模塊。

????????C3模塊相對于BottleneckCSP模塊所不同的是,經(jīng)過Bottleneck模塊輸出后的Conv模塊被去掉了。但是YOLOv4和YOLOv5的Backbone雖然借鑒了CSPNet,但實際上并沒有按照CSPNet原論文中那樣將輸入的特征圖在通道維度上劃分成兩個部分。而是直接用兩路的1×1卷積對輸入特征圖進(jìn)行變換。
(二)犬種數(shù)據(jù)集及模型訓(xùn)練
????????這里我們使用的犬種識別數(shù)據(jù)集,每張圖片均包括類別標(biāo)簽,以及標(biāo)注的物體邊框(Bounding Box),訓(xùn)練集具有6087張圖片、驗證集571張、測試集317張,總計6975張犬種圖像。部分?jǐn)?shù)據(jù)文件及其標(biāo)記框情況如下圖所示。

? ? ? ? 每張圖像均提供了圖像類標(biāo)記信息,圖像中犬種的bounding box,犬種的關(guān)鍵part信息,以及犬種的屬性信息,數(shù)據(jù)集并解壓后得到如下的圖片

? ? ? ? 以上數(shù)據(jù)集經(jīng)過處理后標(biāo)簽文件均轉(zhuǎn)換為YOLOv5訓(xùn)練所需的標(biāo)記格式,基于此數(shù)據(jù)集,我們在train.py中設(shè)置必要參數(shù)后,運(yùn)行該腳本進(jìn)行模型訓(xùn)練,訓(xùn)練過程在終端的顯示如下圖所示。

????????在深度學(xué)習(xí)中,我們通常通過損失函數(shù)下降的曲線來觀察模型訓(xùn)練的情況。而YOLOv5訓(xùn)練時主要包含三個方面的損失:矩形框損失(box_loss)、置信度損失(obj_loss)和分類損失(cls_loss),在訓(xùn)練結(jié)束后,我們也可以在logs目錄下找到生成對若干訓(xùn)練過程統(tǒng)計圖。下圖為博主訓(xùn)練犬種類識別的模型訓(xùn)練曲線圖。

????????一般我們會接觸到兩個指標(biāo),分別是召回率recall和精度precision,兩個指標(biāo)p和r都是簡單地從一個角度來判斷模型的好壞,均是介于0到1之間的數(shù)值,其中接近于1表示模型的性能越好,接近于0表示模型的性能越差,為了綜合評價目標(biāo)檢測的性能,一般采用均值平均密度map來進(jìn)一步評估模型的好壞。我們通過設(shè)定不同的置信度的閾值,可以得到在模型在不同的閾值下所計算出的p值和r值,一般情況下,p值和r值是負(fù)相關(guān)的,繪制出來可以得到如下圖所示的曲線,其中曲線的面積我們稱AP,目標(biāo)檢測模型中每種目標(biāo)可計算出一個AP值,對所有的AP值求平均則可以得到模型的mAP值。

? ? ? ? 以PR-curve為例,可以看到我們的模型在驗證集上的均值平均準(zhǔn)確率為0.974。
(三)犬種檢測識別系統(tǒng)
????????運(yùn)行文件目錄下的testPicture,執(zhí)行得到的結(jié)果如下圖所示,圖中犬種的種類和置信度值都標(biāo)注出來了,預(yù)測速度較快?;诖四P臀覀兛梢詫⑵湓O(shè)計成一個帶有界面的系統(tǒng),在界面上選擇圖片、視頻或攝像頭然后調(diào)用模型進(jìn)行檢測。
????????博主對整個系統(tǒng)進(jìn)行了詳細(xì)測試,最終開發(fā)出一版流暢得到清新界面,就是博文演示部分的展示,完整的UI界面、測試圖片視頻、代碼文件,以及Python離線依賴包(方便安裝運(yùn)行,也可自行配置環(huán)境),均已打包上傳,感興趣的朋友可以通過下載鏈接獲取。
下載鏈接
????若您想獲得博文中涉及的實現(xiàn)完整全部程序文件(包括測試圖片、視頻,py, UI文件等,如下圖),這里已打包上傳至博主的面包多平臺,見可參考博客與視頻,已將所有涉及的文件同時打包到里面,點(diǎn)擊即可運(yùn)行,完整文件截圖如下:

????在文件夾下的資源顯示如下,下面的鏈接中也給出了Python的離線依賴包,讀者可在正確安裝Anaconda和Pycharm軟件后,復(fù)制離線依賴包至項目目錄下進(jìn)行安裝,離線依賴的使用詳細(xì)演示也可見本人B站視頻:win11從頭安裝軟件和配置環(huán)境運(yùn)行深度學(xué)習(xí)項目、Win10中使用pycharm和anaconda進(jìn)行python環(huán)境配置教程。

注意:該代碼采用Pycharm+Python3.8開發(fā),經(jīng)過測試能成功運(yùn)行,運(yùn)行界面的主程序為runMain.py和LoginUI.py,測試圖片腳本可運(yùn)行testPicture.py,測試視頻腳本可運(yùn)行testVideo.py。為確保程序順利運(yùn)行,請按照requirements.txt配置Python依賴包的版本。Python版本:3.8,請勿使用其他版本,詳見requirements.txt文件;
完整資源中包含數(shù)據(jù)集及訓(xùn)練代碼,環(huán)境配置與界面中文字、圖片、logo等的修改方法請見視頻,項目完整文件下載請見參考博客文章里面,或參考視頻的簡介處給出:???
完整代碼下載:https://mbd.pub/o/bread/ZJaXlZ5r
參考視頻演示:https://www.bilibili.com/video/BV1aM4y1r7Qe/
離線依賴庫下載鏈接:https://pan.baidu.com/s/1hW9z9ofV1FRSezTSj59JSg?pwd=oy4n?(提取碼:oy4n )

界面中文字、圖標(biāo)和背景圖修改方法:
在Qt Designer中可以徹底修改界面的各個控件及設(shè)置,然后將ui文件轉(zhuǎn)換為py文件即可調(diào)用和顯示界面。如果只需要修改界面中的文字、圖標(biāo)和背景圖的,可以直接在ConfigUI.config文件中修改,步驟如下:
(1)打開UI_rec/tools/ConfigUI.config文件,若亂碼請選擇GBK編碼打開。
(2)如需修改界面文字,只要選中要改的字符替換成自己的就好。
(3)如需修改背景、圖標(biāo)等,只需修改圖片的路徑。例如,原文件中的背景圖設(shè)置如下:
可修改為自己的名為background2.png圖片(位置在UI_rec/icons/文件夾中),可將該項設(shè)置如下即可修改背景圖:

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