基于YOLOv7算法和Caltech數(shù)據(jù)集的高精度行人目標檢測識別系統(tǒng)(PyTorch+Pyside6+YOLO

摘要:基于YOLOv7算法和Caltech數(shù)據(jù)集的高精度行人目標檢測系統(tǒng)可用于日常生活中檢測與定位行人目標,此系統(tǒng)可完成對輸入圖片、視頻、文件夾以及攝像頭方式的目標檢測與識別,同時本系統(tǒng)還支持檢測結(jié)果可視化與導出。本系統(tǒng)采用YOLOv7目標檢測算法來訓練數(shù)據(jù)集,使用Pysdie6框架來搭建桌面頁面系統(tǒng),支持PT、ONNX等模型權(quán)重作為系統(tǒng)的預測模型加載。本系統(tǒng)實現(xiàn)的功能包括:模型權(quán)重的選擇與初始化;檢測置信度與后處理IOU閾值的調(diào)節(jié);圖像的導入、檢測、檢測結(jié)果的可視化與目標統(tǒng)計;視頻的導入、檢測、檢測結(jié)果的可視化與目標統(tǒng)計;文件夾的圖像批量導入、檢測、檢測結(jié)果的可視化與目標統(tǒng)計;設(shè)備攝像頭的導入、檢測、檢測結(jié)果的可視化與目標統(tǒng)計;單張圖像、視頻、攝像的推理用時展示。本博文詳細介紹系統(tǒng)的環(huán)境搭建過程、整體功能介紹與演示,用時也提供了完整的Python源碼和使用教程,適合新入門的朋友參考同時支持二次開發(fā),整個系統(tǒng)的完整代碼以及資源文件請轉(zhuǎn)至文末的下載鏈接來獲取。

YOLOv7算法原理介紹
2022年7月YOLOv7被提出與發(fā)布,論文發(fā)表在2023的計算機視覺頂級會議CVPR上,在YOLOv3和YOLOv4的官網(wǎng)上均掛上了YOLOv7的鏈接和說明,這說明YOLOv7已得到了大佬的認可。官方版的YOLOv7相同體量下比YOLOv5精度更高,速度快120%(FPS),比 YOLOX 快180%(FPS),比 Dual-Swin-T 快1200%(FPS),比 ConvNext 快550%(FPS),比 SWIN-L快500%(FPS)。在5FPS到160FPS的范圍內(nèi),無論是速度或是精度,YOLOv7都超過了目前已知的檢測器,并且在GPU V100上進行測試,精度為56.8% AP的模型可達到30 FPS(batch=1)以上的檢測速率,與此同時,這是目前唯一一款在如此高精度下仍能超過30FPS的檢測器。
論文地址:https://arxiv.org/pdf/2207.02696.pdf
源碼地址:https://github.com/WongKinYiu/yolov7

YOLOv7模型結(jié)構(gòu)
YOLOv7模型的整體結(jié)構(gòu)如下,與YOLOv5相似,整體可分為Input、Backbone、Neck、Head以及Prediction模塊。

本節(jié)介紹YOLOv7相關(guān)模型里的新的模塊:
(1)ReOrg:位于yolov7-w6.yaml文件中
這個模塊其實是對輸入的信息進行切片操作,與YOLOv2算法的PassThrough層以及YOLOv5(v5.0版本)的Focus操作類似,對輸入圖層盡可能保持原信息并進行下采樣。(這部分代碼具體位于models/common.py文件的48行)
(2)多路卷積模塊
這部分主要還是大量復用1×1的point Conv和3×3的standard Conv,每個Conv 的輸出不僅作為下一個Conv的輸入,還會和所有其他的Conv輸出進行Concat相連操作,類似于DenseNet里面的操作
(3)SPPCSPC模塊
這是一種利用金字塔池化操作和CSP結(jié)構(gòu)得到的模塊,依舊包含了大量支路;總的輸入會被分成三段進入不同的分支,最中間的分支其實就是金字塔池化操作,左側(cè)分支類似于 depthwise Conv,但是請注意中間的3×3卷積并未進行分組,依舊是標準卷積,右側(cè)則為一個point onv,最后將所有分支輸出的信息流進行 concat向量(這部分代碼具體位于models/common.py文件的262行)。
(4)RepConv模塊
RepVGG是一種基于VGG網(wǎng)絡設(shè)計的多分支模型,在訓練過程中可以通過多分支提升性能,推理可以通過結(jié)構(gòu)重新參數(shù)化轉(zhuǎn)換為具有3×3卷積和ReLU的連續(xù)直筒型VGG類網(wǎng)絡,實現(xiàn)推理速度的加快(這部分代碼具體位于models/common.py文件的463行)。
(5)E-ELAN模塊
這部分是對多路卷積模塊的補充,在更大更深的模型才會用到(yolov7-e6e模型中)。在大多數(shù)關(guān)于設(shè)計高效網(wǎng)絡的論文中,主要考慮的因素是參數(shù)量、計算量和計算密度。但從內(nèi)存訪存的角度出發(fā)出發(fā),還可以分析輸入 / 輸出信道比、架構(gòu)的分支數(shù)和元素級操作對網(wǎng)絡推理速度的影響(shufflenet 論文提出)。在執(zhí)行模型縮放時還需考慮激活函數(shù),即更多地考慮卷積層輸出張量中的元素數(shù)量。在大規(guī)模 ELAN 中,無論梯度路徑長度和計算模塊數(shù)量如何,都達到了穩(wěn)定的狀態(tài)。但如果更多計算模塊被無限地堆疊,這種穩(wěn)定狀態(tài)可能會被破壞,參數(shù)利用率也會降低。作者進一步提出E-ELAN,采用 expand、shuffle、merge cardinality 結(jié)構(gòu),實現(xiàn)在不破壞原始梯度路徑的情況下,提高網(wǎng)絡的學習能力(具體在 cfg/training/yolov7-e6e.yaml可看到拆散成單獨算子的結(jié)構(gòu)配置)
YOLOv7損失函數(shù)
YOLOv7整體和YOLOv5保持一致,分為坐標損失、目標置信度損失(GT就是訓練階段的普通IoU)和分類損失三部分。其中目標置信度損失和分類損失采用BCEWithLogitsLoss(帶log的二值交叉熵損失),坐標損失采用CIoU損失。詳細參見utils/loss.py 里面的 ComputeLossOTA函數(shù)。
IoU_Loss:主要考慮檢測框和目標框重疊面積。
GIoU_Loss:在IoU的基礎(chǔ)上,解決邊界框不重合時的問題。
DIoU_Loss:在IoU和GIoU的基礎(chǔ)上,考慮邊界框中心點距離的信息。
CIoU_Loss:在DIoU的基礎(chǔ)上,考慮邊界框?qū)捀弑鹊某叨刃畔ⅰ?/span>
系統(tǒng)環(huán)境搭建
(1)打開Anaconda Prompt(如果電腦沒有anaconda軟件,需下載安裝)
(2)創(chuàng)建yolo7的conda環(huán)境(conda create -n yolo7 python=3.8),并激活yolo7環(huán)境(conda activate yolo7)
(3)進入到項目目錄(本文演示目錄為:E:\Pyside6_yolov7\yolov7)
(4)安裝環(huán)境依賴包:pip install -r requirements.txt
(5)在環(huán)境中輸入:python base_camera,py ???來打開系統(tǒng)界面


系統(tǒng)界面及功能展示
在本博文中將展示設(shè)計的軟件界面,整體界面設(shè)計簡潔大方,提供了直觀的操作體驗,主要功能包括以下幾個方面:
l?模型權(quán)重的導入與初始化
l?檢測置信分與后處理IoU閾值的調(diào)節(jié)
l?已檢測目標的信息展示
l?檢測用時的統(tǒng)計與展示
l?圖像的導入、檢測、結(jié)果可視化展示及導出
l?視頻的導入、檢測、結(jié)果可視化展示及導出
l?文件夾下圖像的批量導入、檢測、結(jié)果可視化展示及導出
l?攝像頭的導入、檢測、結(jié)果可視化展示及導出
軟件的初始界面示例如下圖展示:

模型權(quán)重選擇與初始化
用戶可以通過點擊“模型選擇”按鈕來上傳已訓練好的模型權(quán)重,支持的權(quán)重格式包括.pt以及.onnx等。在上傳了模型權(quán)重后,用戶可以單擊“模型初始化”按鈕,實現(xiàn)對已選擇模型權(quán)重的初始化信息配置。此外,用戶還可以通過調(diào)整各種參數(shù),如置信度閾值(Confidence)、檢測后處理閾值(IoU)等,來優(yōu)化檢測結(jié)果的準確性與速度。在Confidence或IoU下方的輸入框中改變值即可同步改變滑動條的進度,同時改變滑動條的進度值也可同步改變輸入框的值;Confidence或IOU值的改變將同步到模型里的配置來改變檢測置信度閾值與IOU閾值。在完成所有設(shè)置后,用戶可以輕松地啟動檢測過程,并查看檢測結(jié)果的可視化展示。在完成相應的操作后,系統(tǒng)的狀態(tài)欄(系統(tǒng)右下方)也會顯示對應操作的返回結(jié)果。

圖像的選擇、檢測、展示與導出
用戶可以通過點擊“圖像選擇”按鈕,輕松上傳單張圖片進行檢測與識別。接下來,只需單擊“檢測”按鈕(系統(tǒng)右下角的按鈕,詳見上面圖例),系統(tǒng)便會自動完成目標檢測任務。在檢測過程中,系統(tǒng)將在“檢測用時”欄顯示完成檢測的推理時間,并在“目標數(shù)量”欄顯示已檢測到的目標數(shù)量。用戶還可以通過下拉框選擇已檢測目標,并查看相應的位置信息(即左上角x坐標xmin、左上角y坐標ymin、左下角x坐標xmax以及左下角y坐標ymax)標簽值的變化。在檢測完成后,系統(tǒng)的右方會顯示輸入圖像的檢測結(jié)果。
如果用戶希望將檢測結(jié)果保存的話,可以點擊“圖像結(jié)果導出”按鈕,然后在彈出的對話框中輸入保存文件名及后綴(如1.jpg),即可實現(xiàn)檢測結(jié)果圖像的保存。
當用戶點擊結(jié)束按鈕(系統(tǒng)右下角的按鈕,詳見上面圖例)時,系統(tǒng)將退出當前檢測任務并刷新界面,清空所有輸出信息。此外,用戶還可以繼續(xù)點擊“圖像選擇”或“視頻選擇”按鈕來上傳圖像或視頻進行相應的檢測與識別??傊@個系統(tǒng)為用戶提供了一個簡單易用的界面,讓用戶可以快速地完成圖像檢測任務,并方便地查看與導出檢測結(jié)果。具體的操作示例如下圖所示。

視頻的選擇、檢測、展示與導出
用戶可以點擊“視頻選擇”按鈕來上傳視頻進行檢測與識別。接下來,用戶只需單擊“檢測”按鈕(系統(tǒng)右下角的按鈕,詳見上面圖例),系統(tǒng)便會自動完成視頻目標檢測任務。在檢測過程中,系統(tǒng)將在“檢測用時”欄顯示單幀目標檢測的推理時間,并在“目標數(shù)量”欄顯示單幀檢測到的目標數(shù)量,同時本系統(tǒng)采取進度條來直觀地顯示當前檢測進度。用戶還可以通過下拉框選擇已檢測目標,并查看相應的位置信息(即左上角x坐標xmin、左上角y坐標ymin、左下角x坐標xmax以及左下角y坐標ymax)標簽值的變化。在檢測完成后,系統(tǒng)的右方會顯示輸入視頻的檢測結(jié)果。
為了方便用戶暫停觀察視頻檢測結(jié)果,系統(tǒng)提供了“暫?!卑粹o(系統(tǒng)右下角的按鈕,詳見上面圖例)。用戶點擊后系統(tǒng)將會暫停視頻檢測,此時用戶可以通過下拉目標框選擇已檢測目標的坐標位置信息,然后再點擊“繼續(xù)”按鈕(系統(tǒng)右下角的按鈕,詳見上面圖例),即可實現(xiàn)輸入視頻的繼續(xù)檢測。
如果用戶希望將視頻檢測結(jié)果保存,可以點擊“視頻結(jié)果導出”按鈕,然后在彈出的對話框中輸入保存文件名及后綴(如2.mp4),即可實現(xiàn)檢測結(jié)果視頻的保存。當用戶點擊“結(jié)束”按鈕時(系統(tǒng)右下角的按鈕,詳見上面圖例),系統(tǒng)將退出當前視頻檢測任務并刷新界面,清空所有輸出信息

文件夾的批量圖像導入、檢測、展示與導出
用戶可以通過點擊“文件夾”按鈕,輕松完成批量圖片的上傳。接下來,只需單擊“檢測”按鈕(系統(tǒng)右下角的按鈕,詳見上面圖例),系統(tǒng)便會自動完成目標檢測任務對所有文件夾下的圖片進行檢測。在檢測過程中,系統(tǒng)在“檢測用時”欄顯示完成檢測的推理時間,并在“目標數(shù)量”欄顯示已檢測到的目標數(shù)量,同時本系統(tǒng)采取進度條來直觀地顯示當前檢測進度。用戶還可以通過下拉框選擇已檢測目標,并查看相應的位置信息(即左上角x坐標xmin、左上角y坐標ymin、左下角x坐標xmax以及左下角y坐標ymax)標簽值的變化。在檢測完成后,系統(tǒng)的右方會顯示輸入圖像的檢測結(jié)果。
如果用戶希望將檢測結(jié)果批量保存的話,可以點擊“文件夾導出”按鈕,然后在彈出的對話框中選擇輸出文件夾,即可實現(xiàn)批量檢測結(jié)果圖像的保存。當用戶點擊結(jié)束按鈕(系統(tǒng)右下角的按鈕,詳見上面圖例)時,系統(tǒng)將退出當前檢測任務并刷新界面,清空所有輸出信息。具體的操作示例如下圖所示。

攝像頭的檢測、展示與導出
用戶可以通過點擊“攝像頭打開”按鈕來啟動攝像頭設(shè)備(默認開始本機設(shè)備的第一個攝像頭)。接下來,用戶只需單擊“檢測”按鈕(系統(tǒng)右下角的按鈕,詳見上面圖例),系統(tǒng)便會自動完成攝像頭目標檢測任務。在檢測過程中,系統(tǒng)將在“檢測用時”欄顯示消耗的時間,并在“目標數(shù)量”欄顯示已檢測到的目標數(shù)量。用戶還可以通過下拉框選擇已檢測目標,并查看相應的位置信息(即左上角x坐標xmin、左上角y坐標ymin、左下角x坐標xmax以及左下角y坐標ymax)標簽值的變化。
如果用戶希望將攝像頭檢測結(jié)果保存,可以點擊“攝像頭導出”按鈕,然后在彈出的對話框中輸入保存文件名及后綴(如22.mp4),即可實現(xiàn)攝像頭檢測結(jié)果視頻的保存。當用戶點擊“結(jié)束”按鈕時(系統(tǒng)右下角的按鈕,詳見上面圖例),系統(tǒng)將退出當前攝像頭檢測任務并刷新界面,清空所有輸出信息??傊@個系統(tǒng)為用戶提供了一個簡單易用的界面,讓他們可以快速地完成攝像頭檢測任務,并方便地查看與導出檢測結(jié)果。

數(shù)據(jù)集介紹
本系統(tǒng)使用的Caltech行人數(shù)據(jù)集標注了行人這一個類別,數(shù)據(jù)集總計22935張圖片。該數(shù)據(jù)集中類別都有大量的旋轉(zhuǎn)和不同的光照條件,有助于訓練出更加魯棒的檢測模型。本文實驗的Caltech目標檢測數(shù)據(jù)集包含訓練集18569張圖片,驗證集4366張圖片。為了更好地展示數(shù)據(jù)集的分布,選取驗證集中部分數(shù)據(jù)樣本如下圖所示。從圖片中可以看出,數(shù)據(jù)集中的目標有著豐富的多樣性,這將有助于模型學習到更加魯棒的特征。同時為了進一步提高模型的泛化能力和魯棒性,我們還采用了數(shù)據(jù)增強技術(shù)。數(shù)據(jù)增強包括隨機旋轉(zhuǎn)、縮放、裁剪和顏色變換等,可以擴充數(shù)據(jù)集,同時降低過擬合風險。通過這些操作,我們期望模型能夠更好地適應不同的場景,并在實際應用中表現(xiàn)更優(yōu)越。
關(guān)鍵代碼解析
本系統(tǒng)采用PyTorch來實現(xiàn)目標檢測算法,基于YOLOv7算法進行目標檢測。在訓練階段,我們使用了預訓練模型作為初始模型進行訓練,然后通過多次迭代優(yōu)化網(wǎng)絡參數(shù),以達到更好的檢測性能。在訓練過程中,我們采用了學習率衰減和數(shù)據(jù)增強等技術(shù),以增強模型的泛化能力和魯棒性。為了更好地評估模型的性能,我們在訓練集和驗證集上進行了大量的實驗。通過調(diào)整超參數(shù),如學習率、批量大小等,我們最終找到了一個適合本任務的參數(shù)設(shè)置。同時,為了提高模型的泛化能力,我們還采用了數(shù)據(jù)增強技術(shù),如隨機旋轉(zhuǎn)、縮放、裁剪和顏色變換等,以擴充數(shù)據(jù)集,同時降低過擬合風險。
在測試階段,我們使用了訓練好的模型來對新的圖片和視頻進行檢測。通過設(shè)置閾值,將置信度低于閾值的檢測框過濾掉,最終得到檢測結(jié)果。同時,我們還可以將檢測結(jié)果保存為圖片或視頻格式,以便進行后續(xù)分析和應用。本系統(tǒng)基于YOLOv7算法,使用PyTorch實現(xiàn)。代碼中用到的主要庫包括PyTorch、NumPy、OpenCV、Pyside6等。本系統(tǒng)實現(xiàn)的一些關(guān)鍵代碼如下圖所示。

Pyside6界面設(shè)計
PySide6是一款免費的Python跨平臺GUI庫,它是Python的綁定庫,用于開發(fā)跨平臺GUI應用程序。PySide6是基于Qt5和PyQt5庫的下一代Python跨平臺GUI庫,它為開發(fā)人員提供了一個強大的工具集,以構(gòu)建跨平臺的用戶界面。PySide6的主要目標是提高性能,簡化開發(fā)人員的工作,并提供更好的用戶體驗。PySide6的主要特點包括:
l?跨平臺支持:PySide6支持Windows、MacOS和Linux等多個平臺,可以輕松地開發(fā)跨平臺的GUI應用程序。
l?高性能:PySide6采用了Qt5和PyQt5庫的最新技術(shù),為開發(fā)人員提供了更高的性能。
l?簡單易用:PySide6提供了豐富的API和工具,使開發(fā)人員能夠快速地開發(fā)GUI應用程序,而無需過多的編碼。
l?可擴展性:PySide6支持多種GUI組件和控件,可以輕松地擴展和定制應用程序的用戶界面。
l?社區(qū)支持:PySide6有一個活躍的社區(qū),提供了豐富的文檔和示例代碼,幫助開發(fā)人員快速上手。
總的來說,PySide6是一款強大的Python跨平臺GUI庫,它為開發(fā)人員提供了一個簡單易用的工具集,以構(gòu)建跨平臺的用戶界面。PySide6的性能、可擴展性和社區(qū)支持使其成為一款非常適合開發(fā)人員使用的庫。
實驗結(jié)果與分析
在實驗結(jié)果與分析部分,我們使用精度和召回率等指標來評估模型的性能,還通過損失曲線和PR曲線來分析訓練過程。在訓練階段,我們使用了YOLOv7算法對數(shù)據(jù)集進行訓練,總計訓練了300個epochs。從下圖可以看出,隨著訓練次數(shù)的增加,模型的訓練損失和驗證損失都逐漸降低,說明模型不斷地學習到更加精準的特征。在訓練結(jié)束后,我們使用模型在數(shù)據(jù)集的驗證集上進行了評估,得到了以下結(jié)果。
?

下圖展示了我們訓練的YOLOv7模型在驗證集上的PR曲線,從圖中可以看出,模型取得了較高的召回率和精確率,整體表現(xiàn)良好。

綜上,本博文訓練得到的YOLOv7模型在數(shù)據(jù)集上表現(xiàn)良好,具有較高的檢測精度和魯棒性,可以在實際場景中應用。另外本博主對整個系統(tǒng)進行了詳細測試,最終開發(fā)出一版流暢的高精度目標檢測系統(tǒng)界面,就是本博文演示部分的展示,完整的UI界面、測試圖片視頻、代碼文件等均已打包上傳,感興趣的朋友可以關(guān)注我私信獲取下載鏈接。另外本博文的PDF與更多的目標檢測識別系統(tǒng)請關(guān)注筆者的微信公眾號 BestSongC (目前已發(fā)布基于YOLOv5算法和YOLOv8算法開發(fā)的系統(tǒng)界面,以及目標檢測算法改進系列)來獲取。
其他基于深度學習的目標檢測系統(tǒng)如西紅柿、貓狗、山羊、野生目標、煙頭、二維碼、頭盔、交警、野生動物、野外煙霧、人體摔倒識別、紅外行人、家禽豬、蘋果、推土機、蜜蜂、打電話、鴿子、足球、奶牛、人臉口罩、安全背心、煙霧檢測系統(tǒng)等有需要的朋友關(guān)注我,從博主其他視頻中獲取下載鏈接。
完整項目目錄如下所示

?
?
?
?
?
?