摘要:動物識別系統(tǒng)用于識別和統(tǒng)計(jì)常見動物數(shù)量,通過深度學(xué)習(xí)技術(shù)檢測日常幾種動物圖像識別,支持圖片、視頻和攝像頭畫面等形式。在介紹算法原理的同時(shí),給出Python的實(shí)現(xiàn)代碼、訓(xùn)練數(shù)據(jù)集以及PyQt的UI界面。動物識別系統(tǒng)主要用于常見動物的識別,檢測幾種動物的數(shù)目、位置、預(yù)測置信度等;檢測模型可選擇切換,識別結(jié)果記錄在界面表格中;系統(tǒng)設(shè)計(jì)有注冊登錄功能,方便用戶進(jìn)行管理和使用。博文提供了完整的Python代碼和使用教程,適合新入門的朋友參考,完整代碼資源文件請轉(zhuǎn)至文末的下載鏈接。本博文目錄如下:
?點(diǎn)擊跳轉(zhuǎn)至文末所有涉及的完整代碼文件下載頁?
基于深度學(xué)習(xí)的動物識別系統(tǒng)演示與介紹(PyQt5+YOLOv5深度學(xué)習(xí)模型+清新界面)
前言
????????人工智能的出現(xiàn)引發(fā)了動物監(jiān)測與識別的巨大變革,如何應(yīng)用智能技術(shù),來開展野生動物資源的觀測與評估工作成為研究重點(diǎn)。如今CNN作為一種學(xué)習(xí)效率極高且易于訓(xùn)練的深度學(xué)習(xí)模型,在動物識別中最為常用。在CNN的基礎(chǔ)上,人們通過對卷積層、池化層、全連接層等結(jié)構(gòu)的交替與優(yōu)化,加強(qiáng)對圖像的特征提取并通過調(diào)整網(wǎng)絡(luò)層數(shù)加強(qiáng)學(xué)習(xí)能力,進(jìn)一步訓(xùn)練提高識別性能。
????????這里博主也設(shè)計(jì)了基于深度學(xué)習(xí)的動物識別系統(tǒng),下面給出了軟件界面,同款的簡約風(fēng),功能也可以滿足圖片、視頻和攝像頭的識別檢測,希望大家可以喜歡,初始界面如下圖:
????????檢測動物時(shí)的界面截圖(點(diǎn)擊圖片可放大)如下圖,可識別畫面中存在的多個(gè)動物,也可開啟攝像頭或視頻檢測:
???????? 詳細(xì)的功能演示效果參見博主的B站視頻或下一節(jié)的動圖演示,覺得不錯(cuò)的朋友敬請點(diǎn)贊、關(guān)注加收藏!系統(tǒng)UI界面的設(shè)計(jì)工作量較大,界面美化更需仔細(xì)雕琢,大家有任何建議或意見和可在下方評論交流。
1. 效果演示
????????這里通過動圖看一下識別動物的效果,系統(tǒng)主要實(shí)現(xiàn)的功能是對圖片、視頻和攝像頭畫面中的動物屬性進(jìn)行識別,識別的結(jié)果可視化顯示在界面和圖像中,另外提供多個(gè)動物的顯示選擇功能,演示效果如下。
(一)用戶注冊登錄界面
????????這里設(shè)計(jì)了一個(gè)登錄界面,可以注冊賬號和密碼,然后進(jìn)行登錄。界面還是參考了當(dāng)前流行的UI設(shè)計(jì),左側(cè)是一個(gè)logo,右側(cè)輸入賬號、密碼、驗(yàn)證碼
(二)選擇圖片識別
????????系統(tǒng)允許選擇圖片文件進(jìn)行識別,點(diǎn)擊圖片選擇按鈕圖標(biāo)選擇圖片后,顯示所有動物識別的結(jié)果,可通過下拉選框查看單個(gè)動物的類別。本功能的界面展示如下圖所示:
(三)視頻識別效果展示
????????很多時(shí)候我們需要識別一段視頻中的動物種類,這里設(shè)計(jì)了視頻選擇功能。點(diǎn)擊視頻按鈕可選擇待檢測的視頻,系統(tǒng)會自動解析視頻逐幀識別動物,并將結(jié)果記錄在右下角表格中,效果如下圖所示:
2. 原理與數(shù)據(jù)集
(一)源碼簡介
????????基于人工特征的野生動物識別方法主要通過人工對野生動物圖像中具有辨識度的特征信息進(jìn)行提取,并通過特征比對的方式就可以對野生動物所屬的類別進(jìn)行識別判斷。本文借助YOLOv5實(shí)現(xiàn),下面介紹一下YOLOv5原理。
????????YOLOv5的調(diào)用、訓(xùn)練和預(yù)測都十分方便,并且它為不同的設(shè)備需求和不同的應(yīng)用場景提供了大小和參數(shù)數(shù)量不同的網(wǎng)絡(luò)。
????????(1)主干部分:使用了Focus網(wǎng)絡(luò)結(jié)構(gòu),具體操作是在一張圖片中每隔一個(gè)像素拿到一個(gè)值,這個(gè)時(shí)候獲得了四個(gè)獨(dú)立的特征層,然后將四個(gè)獨(dú)立的特征層進(jìn)行堆疊,此時(shí)寬高信息就集中到了通道信息,輸入通道擴(kuò)充了四倍。該結(jié)構(gòu)在YoloV5第5版之前有所應(yīng)用,最新版本中未使用。
????????(2)數(shù)據(jù)增強(qiáng):Mosaic數(shù)據(jù)增強(qiáng)、Mosaic利用了四張圖片進(jìn)行拼接實(shí)現(xiàn)數(shù)據(jù)中增強(qiáng),優(yōu)點(diǎn)是可以豐富檢測物體的背景,且在BN計(jì)算的時(shí)候可以計(jì)算四張圖片的數(shù)據(jù)。
????????(3)多正樣本匹配:在之前的Yolo系列里面,在訓(xùn)練時(shí)每一個(gè)真實(shí)框?qū)?yīng)一個(gè)正樣本,即在訓(xùn)練時(shí),每一個(gè)真實(shí)框僅由一個(gè)先驗(yàn)框負(fù)責(zé)預(yù)測。YoloV5中為了加快模型的訓(xùn)練效率,增加了正樣本的數(shù)量,在訓(xùn)練時(shí),每一個(gè)真實(shí)框可以由多個(gè)先驗(yàn)框負(fù)責(zé)預(yù)測。
(二)數(shù)據(jù)集準(zhǔn)備
????????這里我們使用的動物識別數(shù)據(jù)集,是從COCO和VOC數(shù)據(jù)集中抽取的包含鳥、貓、狗、馬、羊等類別的圖像數(shù)據(jù),每張圖片除包括類別標(biāo)簽外,還有一個(gè)標(biāo)注的物體邊框(Bounding Box)。組成的訓(xùn)練數(shù)據(jù)集包含1284張圖片,驗(yàn)證集321張圖片,測試集321張圖片,共計(jì)1926張圖片。
Chinese_name = {'bird': "鳥",
'cat': "貓",
'cow': "牛",
'dog': "狗子",
'horse': "馬",
'sheep': "羊"
}
????????由于原數(shù)據(jù)集采用的是xml的標(biāo)注文件格式,所以我們需要將xml格式修改為YOLOv5能夠使用的標(biāo)注格式,可通過以下代碼進(jìn)行轉(zhuǎn)換:
classes = dict()
num_classes = 0
parentpath = '' # "Directory path with parent dir before xml_dir or img_dir"
addxmlpath = parentpath + 'PersonCar/annotations/train' # "Directory path with XML files"
addimgpath = parentpath + 'PersonCar/images/train' # "Directory path with IMG files"
outputpath = parentpath + 'PersonCar/labels/train' # "output folder for yolo format"
classes_txt = './personcar_classes.txt' # "File containing classes"
ext = '.jpg' # "Image file extension [.jpg or .png]"
if os.path.isfile(classes_txt):
with open(classes_txt, "r") as f:
class_list = f.read().strip().split()
classes = {k: v for (v, k) in enumerate(class_list)}
xmlPaths = glob(addxmlpath + "/*.xml")
# 保存數(shù)據(jù)集圖片路徑到txt
imgPaths = glob(addimgpath + "/*.jpg")
with open("./train.txt","w") as f:
for imgPath in imgPaths:
imgPath = imgPath.replace("\\", "/")
f.write(imgPath+"\n")
for xmlPath in xmlPaths:
tVocParseReader = PascalVocReader(xmlPath)
shapes = tVocParseReader.getShapes()
with open(outputpath + "/" + os.path.basename(xmlPath)[:-4] + ".txt", "w") as f:
for shape in shapes:
class_name = shape[0]
box = shape[1]
# filename = os.path.splittext(xmlPath)[0] + ext
filename = os.path.splitext(addimgpath + "/" + os.path.basename(xmlPath)[:-4])[0] + ext
if class_name not in classes.keys():
classes[class_name] = num_classes
num_classes += 1
class_idx = classes[class_name]
(height, width, _) = cv2.imread(filename).shape
coord_min = box[0]
coord_max = box[2]
xcen = float((coord_min[0] + coord_max[0])) / 2 / width
ycen = float((coord_min[1] + coord_max[1])) / 2 / height
w = float((coord_max[0] - coord_min[0])) / width
h = float((coord_max[1] - coord_min[1])) / height
f.write("%d %.06f %.06f %.06f %.06f\n" % (class_idx, xcen, ycen, w, h))
print(class_idx, xcen, ycen, w, h)
with open(parentpath + "classes.txt", "w") as f:
for key in classes.keys():
f.write("%s\n" % key)
print(key)
????????打開具體的標(biāo)注文件,你將會看到下面的內(nèi)容,txt文件中每一行表示一個(gè)目標(biāo),以空格進(jìn)行區(qū)分,分別表示目標(biāo)的類別id,歸一化處理之后的中心點(diǎn)x坐標(biāo)、y坐標(biāo)、目標(biāo)框的w和h。
3. 基于YOLOv5的訓(xùn)練與識別
(一)訓(xùn)練過程
????????我們可以在終端輸入如下命令進(jìn)行訓(xùn)練,當(dāng)然也可以直接點(diǎn)擊train.py運(yùn)行。
python train.py --batch 32 --epochs 300
????????在深度學(xué)習(xí)中,我們通常通過損失函數(shù)下降的曲線來觀察模型訓(xùn)練的情況。而YOLOv5訓(xùn)練時(shí)主要包含三個(gè)方面的損失:矩形框損失(box_loss)、置信度損失(obj_loss)和分類損失(cls_loss),在訓(xùn)練結(jié)束后,我們也可以在logs目錄下找到生成對若干訓(xùn)練過程統(tǒng)計(jì)圖。下圖為博主訓(xùn)練動物類識別的模型訓(xùn)練曲線圖。
????????一般我們會接觸到兩個(gè)指標(biāo),分別是召回率recall和精度precision,兩個(gè)指標(biāo)p和r都是簡單地從一個(gè)角度來判斷模型的好壞,均是介于0到1之間的數(shù)值,其中接近于1表示模型的性能越好,接近于0表示模型的性能越差,為了綜合評價(jià)目標(biāo)檢測的性能,一般采用均值平均密度map來進(jìn)一步評估模型的好壞。我們通過設(shè)定不同的置信度的閾值,可以得到在模型在不同的閾值下所計(jì)算出的p值和r值,一般情況下,p值和r值是負(fù)相關(guān)的,繪制出來可以得到如下圖所示的曲線,其中曲線的面積我們稱AP,目標(biāo)檢測模型中每種目標(biāo)可計(jì)算出一個(gè)AP值,對所有的AP值求平均則可以得到模型的mAP值。
????????以PR-curve為例,可以看到我們的模型在驗(yàn)證集上的均值平均準(zhǔn)確率為0.755。
(二)預(yù)測過程
????????執(zhí)行predict.py得到的結(jié)果如下圖所示,圖中動物的種類和置信度值都標(biāo)注出來了,預(yù)測速度較快。基于此模型我們可以將其設(shè)計(jì)成一個(gè)帶有界面的系統(tǒng),在界面上選擇圖片、視頻或攝像頭然后調(diào)用模型進(jìn)行檢測。
????????博主整個(gè)系統(tǒng)進(jìn)行了詳細(xì)測試,最終開發(fā)出一版流暢得到清新界面,就是博文演示部分的展示,完整的UI界面、測試圖片視頻、代碼文件,以及Python離線依賴包(方便安裝運(yùn)行,也可自行配置環(huán)境),均已打包上傳,感興趣的朋友可以通過下載鏈接獲取。
下載鏈接
????若您想獲得博文中涉及的實(shí)現(xiàn)完整全部程序文件(包括測試圖片、視頻,py, UI文件等,如下圖),這里已打包上傳至博主的面包多平臺,見可參考博客與視頻,已將所有涉及的文件同時(shí)打包到里面,點(diǎn)擊即可運(yùn)行,完整文件截圖如下:
????在文件夾下的資源顯示如下,下面的鏈接中也給出了Python的離線依賴包,讀者可在正確安裝Anaconda和Pycharm軟件后,復(fù)制離線依賴包至項(xiàng)目目錄下進(jìn)行安裝,離線依賴的使用詳細(xì)演示也可見本人B站視頻:win11從頭安裝軟件和配置環(huán)境運(yùn)行深度學(xué)習(xí)項(xiàng)目、Win10中使用pycharm和anaconda進(jìn)行python環(huán)境配置教程。
注意:該代碼采用Pycharm+Python3.8開發(fā),經(jīng)過測試能成功運(yùn)行,運(yùn)行界面的主程序?yàn)閞unMain.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等的修改方法請見視頻,項(xiàng)目完整文件下載請見參考博客文章里面,或參考視頻的簡介處給出:???
參考博客文章:https://www.cnblogs.com/sixuwuxian/p/17234723.html
參考視頻演示:https://www.bilibili.com/video/BV1yT411r7kG/
離線依賴庫下載鏈接:https://pan.baidu.com/s/1hW9z9ofV1FRSezTSj59JSg?pwd=oy4n (提取碼:oy4n )
界面中文字、圖標(biāo)和背景圖修改方法:
????????在Qt Designer中可以徹底修改界面的各個(gè)控件及設(shè)置,然后將ui文件轉(zhuǎn)換為py文件即可調(diào)用和顯示界面。如果只需要修改界面中的文字、圖標(biāo)和背景圖的,可以直接在ConfigUI.config文件中修改,步驟如下:
????????(1)打開UI_rec/tools/ConfigUI.config文件,若亂碼請選擇GBK編碼打開。
????????(2)如需修改界面文字,只要選中要改的字符替換成自己的就好。
????????(3)如需修改背景、圖標(biāo)等,只需修改圖片的路徑。例如,原文件中的背景圖設(shè)置如下:
mainWindow = :/images/icons/back-image.png
????????可修改為自己的名為background2.png圖片(位置在UI_rec/icons/文件夾中),可將該項(xiàng)設(shè)置如下即可修改背景圖:文章來源:http://www.zghlxwxcb.cn/news/detail-799446.html
mainWindow = ./icons/background2.png
結(jié)束語
????????由于博主能力有限,博文中提及的方法即使經(jīng)過試驗(yàn),也難免會有疏漏之處。希望您能熱心指出其中的錯(cuò)誤,以便下次修改時(shí)能以一個(gè)更完美更嚴(yán)謹(jǐn)?shù)臉幼樱尸F(xiàn)在大家面前。同時(shí)如果有更好的實(shí)現(xiàn)方法也請您不吝賜教。文章來源地址http://www.zghlxwxcb.cn/news/detail-799446.html
到了這里,關(guān)于基于深度學(xué)習(xí)的動物識別系統(tǒng)(YOLOv5清新界面版,Python代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!