摘要:開發行人車輛檢測與計數系統對于提升城市交通管理和監控系統的效率至關重要。本篇博客詳細介紹了如何利用深度學習構建一個行人車輛檢測與計數系統,并提供了完整的實現代碼。該系統基于強大的YOLOv8算法,并結合了YOLOv7、YOLOv6、YOLOv5的對比,給出了不同模型之間的性能指標如mAP、F1 Score等結果分析。文章深入講解了YOLOv8算法的底層原理,提供了相應的Python代碼、訓練數據集,并封裝成一個基于PySide6的美觀UI界面。
系統能夠精準地檢測和分類圖像中的行人和車輛,支持選擇圖片、圖片文件夾、視頻文件以及開啟攝像頭檢測,包含標記框類別、類別統計、可調Conf、IOU參數、可視化結果顯示等功能。另外,設計了基于SQLite數據庫的用戶注冊登錄管理界面、可點擊按鈕切換不同模型、可方便修改的UI界面。本文旨在為深度學習領域的新手提供一份實用指導和參考,完整的代碼和數據集已在文章結尾提供鏈接,便于讀者下載和使用。本文結構如下:
文章目錄
- 前言
- 1.數據集介紹
- 2. 系統界面效果
- 3. YOLOv8算法原理
- 4. 代碼簡介
- 4.1 模型預測
- 4.2 模型訓練
- 4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8對比
- 4.4 代碼實現
- 5. 行人車輛檢測與計數實現
- 5.1 系統設計思路
- 5.2 登錄與賬戶管理
- 下載鏈接
- 6. 總結與展望
- 結束語
?點擊跳轉至文末所有涉及的完整代碼文件下載頁?
基于YOLOv8/v7/v6/v5的行人車輛檢測與計數演示與介紹(深度學習模型+PySide6界面+訓練代碼)
前言
????????在當今社會,隨著城市化進程的加速和汽車數量的劇增,交通管理和城市安全監控面臨著前所未有的挑戰。行人車輛檢測與計數作為智能交通系統(ITS)和城市監控系統的關鍵技術之一,對于緩解交通擁堵、預防交通事故、提高道路使用效率以及加強公共安全監控等方面具有重要的研究意義和應用價值。隨著人工智能和計算機視覺技術的快速發展,特別是深度學習技術的廣泛應用,行人和車輛的自動檢測技術已經取得了顯著的進步。
????????隨著深度學習技術的快速發展,行人車輛檢測領域已經取得了顯著的進步。特別是,基于卷積神經網絡(CNN)的對象檢測模型,在提高檢測精度和速度方面發揮了重要作用。YOLO系列作為代表之一,從YOLOv1到最新的YOLOv8,每一次更新都在推動著檢測技術的極限。YOLOv81通過引入更加復雜的網絡結構和優化算法,大幅提高了在多種標準數據集上的檢測性能,成為行人和車輛檢測研究中的重要工具。同時,Transformer模型的引入為對象檢測提供了新的視角。ViT(Vision Transformer)在圖像分類任務上的成功激發了研究者將其應用于對象檢測領域,通過引入自注意力機制,ViT能夠更好地捕捉圖像中的全局依賴關系,這對于復雜場景下的行人和車輛檢測尤為重要。
????????除了YOLO系列和Transformer模型外,近年來還出現了多種優化算法和技術,旨在進一步提高檢測的準確性和實時性。例如,一些研究通過改進損失函數和錨框生成策略,有效提高了小目標檢測的精度。其他研究則聚焦于模型的輕量化和加速,使得行人車輛檢測技術能夠更好地部署在移動設備和邊緣計算平臺上。此外,數據增強技術的發展也為提高模型的泛化能力和魯棒性提供了重要支持。通過模擬不同光照和天氣條件,增強后的數據集能夠幫助模型更好地適應實際應用中的多變環境。
????????Swin Transformer是一種基于Transformer2的新型網絡架構,它將圖像分割為多個小塊并在這些塊上應用自注意力機制,能夠更有效地捕捉圖像中的局部細節和全局上下文信息。Swin Transformer在行人和車輛檢測任務中表現出色,尤其是在處理遮擋和復雜場景時的性能優于傳統CNN模型。
????????CenterNet2是在原有CenterNet基礎上的改進,它采用了一種新穎的中心點檢測機制,通過預測物體中心點及其屬性(如大小、形狀等)來實現檢測。該模型還結合了一種高效的特征融合策略,顯著提升了對小目標和密集場景下目標的檢測精度。CenterNet2在多個公開數據集上都展現了優越的檢測性能。
????????面對復雜多變的交通場景和不斷增長的性能需求,行人車輛檢測領域仍然面臨著眾多挑戰。盡管YOLOv8等最新模型在性能上取得了顯著的進步,但在處理高密度人群和車輛、遮擋情況以及極端天氣條件下的檢測任務時,仍然存在限制。因此,未來的研究方向之一是如何進一步優化模型結構和算法,以提高在這些復雜場景下的檢測精度和速度。另外,隨著自動駕駛技術的發展,如何實現更高效的實時檢測和跟蹤,以及如何通過多傳感器融合技術提高檢測系統的魯棒性,也將是重要的研究方向。此外,隨著人工智能倫理和隱私保護意識的提高,如何在保證檢測效率的同時,確保技術應用的倫理性和安全性,也是未來研究需要重點關注的問題。
????????本博客在行人車輛檢測與計數領域做出了顯著的貢獻,不僅深入探討了最新的目標檢測算法YOLOv8的應用,還實現了一個具有用戶友好界面的系統,提供了一套完整的解決方案,包括詳細的算法原理講解、系統開發過程分享、以及豐富的代碼資源。具體貢獻如下:
- 采用最先進的YOLOv8算法:我們基于YOLOv8算法開發了行人車輛檢測與計數系統,該算法相較于先前的版本(YOLOv73、YOLOv64、YOLOv55)在處理速度和準確度方面都有顯著提升。通過詳細的性能對比分析,我們展示了YOLOv8在行人車輛檢測任務中的優越性,為該領域的研究和應用提供了新的視角。
- 利用PySide6實現友好的用戶界面:通過Python的PySide6庫,我們開發了一個易于操作、直觀的行人車輛檢測與計數系統界面。該界面不僅簡化了用戶操作,還提高了算法的可訪問性和實用性,使得非專業用戶也能輕松進行行人車輛檢測與計數。
- 集成登錄管理功能:系統集成的登錄管理功能增強了使用的安全性和個性化體驗,為將來添加更多定制功能奠定了基礎,同時也體現了我們對用戶體驗和系統安全的重視。
- 對YOLOv8模型的深入研究:除了應用實現,我們還對YOLOv8算法的性能進行了全面的評估,包括精確度、召回率等關鍵指標的分析,以及模型在不同環境條件下的表現評估。這一部分的研究不僅加深了對YOLOv8算法的理解,也為進一步的算法優化和應用拓展提供了堅實的基礎。
- 提供完整的數據集和代碼資源包:為了促進行人車輛檢測與計數技術的進一步研究和開發,我們分享了完整的數據集和代碼資源包。這些資源不僅便于讀者復現我們的實驗結果,還能鼓勵和促進該領域內的進一步探索和創新。
1.數據集介紹
????????在本博客中,我們將詳細介紹用于行人車輛檢測與計數任務的數據集。這個數據集由5542張精心挑選的圖像組成,分為2856張訓練圖像、1343張驗證圖像和1343張測試圖像。這樣的分布旨在確保模型在訓練期間可以學習到足夠的特征,并在后期能夠通過驗證和測試集準確評估模型的泛化能力。
????????在圖像預處理方面,我們采取了自動方向校正,確保所有圖像均以正確的方向呈現,剝離了可能會引起模型混淆的EXIF方向信息。此外,每張圖像都被統一調整至800x800像素的尺寸,這樣的標準化處理對于保持檢測算法的一致性和可靠性至關重要。雖然這一步驟涉及了圖像的拉伸,但它確保了在不同尺寸和比例的圖像之間不會丟失任何像素信息,從而讓模型能夠更好地從圖像中學習特征。
????????我們的數據集涵蓋了從行人到各類車輛的多種對象,其中行人類別的實例數量最多,接近10000個實例,其次是車輛,其他類別如自行車、摩托車、公交車、卡車和火車數量逐漸減少。這種類別分布反映了現實世界中的典型場景,其中行人和私家車輛是街道上最常見的元素。通過這種多樣化的類別設置,數據集不僅適用于行人檢測任務,也適用于車輛檢測,特別是在復雜的城市交通環境中。
????????通過對數據集的進一步分析,我們可以觀察到一些關鍵的分布特征。例如,邊界框位置的熱力圖顯示,大部分檢測對象傾向于出現在圖像的中心區域。這可能與行人和車輛在道路中心出現的頻率有關,因此,檢測算法在這一區域需要特別精準。同樣,對象中心點的分布圖揭示了檢測對象主要集中在圖像的中部,這為我們設計感興趣區域(ROI)提供了依據,可能在這些高頻區域采用更高的分辨率或更密集的采樣。
????????此外,邊界框寬度和高度的分布圖表明數據集中包含大量的小尺寸目標。這對檢測算法提出了挑戰,因為小目標的識別通常更加困難。檢測算法需要具備較強的局部特征學習能力,以便在圖像中準確識別和定位這些小目標。博主使用的類別代碼如下:
Chinese_name = {'person': "行人", 'bicycle': '自行車', 'car': '小汽車', 'motorcycle': '摩托車','bus': '公交車', 'truck': '卡車', 'train': '火車'}
????????總結來說,本文介紹的數據集是一個綜合且具有挑戰性的資源,它不僅為行人車輛檢測算法的開發和評估提供了豐富的數據,還通過詳細的預處理和類別分布,為研究者和實踐者提供了理解和應對現實世界復雜場景的必要工具。通過本數據集的應用,我們期待推動該領域內檢測技術的進步,并激發更多關于優化和實施高效目標檢測系統的研究和討論。
2. 系統界面效果
????????系統以PySide6作為GUI庫,提供了一套直觀且友好的用戶界面。下面,我將詳細介紹各個主要界面的功能和設計。
(1)系統提供了基于SQLite的注冊登錄管理功能。用戶在首次使用時需要通過注冊界面進行注冊,輸入用戶名和密碼后,系統會將這些信息存儲在SQLite數據庫中。注冊成功后,用戶可以通過登錄界面輸入用戶名和密碼進行登錄。這個設計可以確保系統的安全性,也為后續添加更多個性化功能提供了可能性。
(2)在主界面上,系統提供了支持圖片、視頻、實時攝像頭和批量文件輸入的功能。用戶可以通過點擊相應的按鈕,選擇要進行行人車輛檢測的圖片或視頻,或者啟動攝像頭進行實時檢測。在進行行人車輛檢測時,系統會實時顯示檢測結果,并將檢測記錄存儲在數據庫中。
(3)此外,系統還提供了一鍵更換YOLOv8/v5模型的功能。用戶可以通過點擊界面上的"更換模型"按鈕,選擇不同的YOLOv8模型進行檢測。與此同時,系統附帶的數據集也可以用于重新訓練模型,以滿足用戶在不同場景下的檢測需求。
(4)為了提供更個性化的使用體驗,這里系統支持界面修改,用戶可以自定義圖標、文字等界面元素。例如,用戶可以根據自己的喜好,選擇不同風格的圖標,也可以修改界面的文字描述。
3. YOLOv8算法原理
????????YOLOv8算法作為目標檢測領域的最新進展,繼承并發展了YOLO系列的核心理念,即“你只看一次”(You Only Look Once),它通過單次的前向傳播過程實現對圖像中目標的檢測,大幅提升了檢測速度,使其非常適合實時應用場景。YOLOv8在算法架構上引入了一系列的創新點,以進一步提升其性能。
????????首先,YOLOv8采用了一個全新的多尺度特征金字塔網絡,這意味著它能夠同時在不同的尺度上檢測目標,使其能夠更準確地處理各種尺寸的目標。通過這種多尺度檢測策略,YOLOv8在檢測小目標和遮擋情況下的目標時表現尤為出色。這種多尺度特征表征能力,使得YOLOv8在處理復雜場景時具有更好的適應性和魯棒性。
????????其次,YOLOv8的骨干網絡CSPDarknet53結合了殘差網絡的設計,通過引入跨階段部分網絡(CSPNet)結構,有效減少了計算資源的消耗,并優化了梯度流,這對于加速訓練過程和提升檢測性能至關重要。CSPDarknet53的設計減輕了模型的參數負擔,同時保持了特征表達的豐富性,這對于檢測精度的提高尤為關鍵。
????????此外,YOLOv8在訓練策略上也進行了創新。它采用自適應訓練樣本選擇機制來優化模型性能,這種機制允許模型在訓練過程中更聚焦于難以檢測的目標,從而更有效地提高模型對這些目標的檢測能力。這種自適應的訓練方法使得YOLOv8能夠在保持高速檢測的同時,進一步提高模型的準確率和泛化能力。
????????最后,YOLOv8的算法結構中采用了高級別的自動化,減輕了模型設計和調優的負擔,使得算法更加易于實現和部署。這種自動化程度的提高,在保持高效性能的同時,也大大降低了將算法應用到實際產品中的門檻。
????????綜合以上特點,YOLOv8不僅在速度和精度上取得了平衡,還通過結構和訓練的創新,增強了對復雜場景的適應能力,顯著提升了目標檢測技術的實用價值。通過這些細節的介紹,我們可以深入理解YOLOv8算法的原理,以及它在行人車輛檢測與計數任務中的應用潛力。
4. 代碼簡介
????????在本節中,我們將詳細介紹如何使用YOLOv8進行行人車輛檢測的代碼實現。代碼主要分為兩部分:模型預測和模型訓練。
4.1 模型預測
????????在模型預測部分,首先導入了OpenCV庫和YOLO模型。OpenCV庫是一個開源的計算機視覺和機器學習軟件庫,包含了眾多的視覺處理函數,使用它來讀取和處理圖像。YOLO模型則是要用到的目標檢測模型。
import cv2
from ultralytics import YOLO
????????接著,加載自行訓練好的YOLO模型。這個模型是在大量的圖像上預訓練得到的,可以直接用于目標檢測任務。
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current"))
????????然后,使用OpenCV讀取了一個圖像文件,這個圖像文件作為要進行目標檢測的圖像輸入。
img_path = abs_path("test_media/test.png")
image = cv_imread(img_path)
????????在讀取了圖像文件之后,就可以使用加載的模型對圖像進行預測了。下圖為預測結果。
pred, superimposed_img = model.predict(pre_img)
4.2 模型訓練
????????這里我們開始訓練和測試自己的數據集,在cmd終端或pycharm中運行run_train_model.py進行訓練,以下是訓練過程中的結果截圖。YOLOv8的損失函數是其性能的關鍵部分,它指導模型學習如何準確地檢測和分類對象。以下表格詳細介紹了YOLOv8模型訓練中使用的一些重要超參數及其設置:
超參數 | 設置 | 說明 |
---|---|---|
學習率(lr0 ) | 0.01 | 決定了模型權重調整的步長大小,在訓練初期有助于快速收斂。 |
學習率衰減(lrf ) | 0.01 | 控制訓練過程中學習率的降低速度,有助于模型在訓練后期細致調整。 |
動量(momentum ) | 0.937 | 加速模型在正確方向上的學習,并減少震蕩,加快收斂速度。 |
權重衰減(weight_decay ) | 0.0005 | 防止過擬合,通過在損失函數中添加正則項減少模型復雜度。 |
熱身訓練周期(warmup_epochs ) | 3.0 | 初始幾個周期內以較低的學習率開始訓練,逐漸增加到預定學習率。 |
批量大小(batch ) | 16 | 每次迭代訓練中輸入模型的樣本數,影響GPU內存使用和模型性能。 |
輸入圖像大小(imgsz ) | 640 | 模型接受的輸入圖像的尺寸,影響模型的識別能力和計算負擔。 |
????????在本博客的這一章節中,我們將深入探討如何使用Python和PyTorch框架以及YOLOv8進行行人車輛檢測模型的訓練。我們的目標是搭建一個能夠準確檢測和計數行人及車輛的模型,以便將其應用于智能交通系統和城市監控系統等實際場景。首先,我們從導入必要的庫和模塊開始。os和torch是Python編程中常用的庫,分別用于操作系統級任務和深度學習計算。yaml用于處理YAML文件,這是一種常用的配置文件格式。ultralytics是一個包含YOLO模型實現的庫,而QtFusion.path則提供了一種方法來獲取文件的絕對路徑。
import osimport torch
import yaml
from ultralytics import YOLO # 導入YOLO模型
from QtFusion.path import abs_path
device = "cuda:0" if torch.cuda.is_available() else "cpu"
????????接下來,我們設置了訓練模型時使用的基本參數。這包括使用的工作進程數workers和每個批次的大小batch。這些參數是深度學習訓練過程中的關鍵配置,影響數據加載的效率和批處理的速度。我們的數據集配置文件VehicleTypeDet.yaml包含了訓練、驗證和測試圖像的路徑以及類別信息。我們首先獲取這個YAML文件的絕對路徑,并對路徑字符串進行處理,確保它符合Unix風格的路徑標準,因為不同操作系統間的路徑表示有所差異。
if __name__ == '__main__': # 確保該模塊被直接運行時才執行以下代碼workers = 1batch = 8data_name = "VehicleTypeDet"data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current') # 數據集的yaml的絕對路徑unix_style_path = data_path.replace(os.sep, '/')# 獲取目錄路徑directory_path = os.path.dirname(unix_style_path)# 讀取YAML文件,保持原有順序with open(data_path, 'r') as file:data = yaml.load(file, Loader=yaml.FullLoader)# 修改path項if 'path' in data:data['path'] = directory_path# 將修改后的數據寫回YAML文件with open(data_path, 'w') as file:yaml.safe_dump(data, file, sort_keys=False)model = YOLO(abs_path('./weights/yolov5nu.pt', path_type='current'), task='detect') # 加載預訓練的YOLOv8模型# model = YOLO('./weights/yolov5.yaml', task='detect').load('./weights/yolov5nu.pt') # 加載預訓練的YOLOv8模型# Training.results = model.train( # 開始訓練模型data=data_path, # 指定訓練數據的配置文件路徑device=device, # 自動選擇進行訓練workers=workers, # 指定使用2個工作進程加載數據imgsz=640, # 指定輸入圖像的大小為640x640epochs=120, # 指定訓練100個epochbatch=batch, # 指定每個批次的大小為8name='train_v5_' + data_name # 指定訓練任務的名稱)model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect') # 加載預訓練的YOLOv8模型results2 = model.train( # 開始訓練模型data=data_path, # 指定訓練數據的配置文件路徑device=device, # 自動選擇進行訓練workers=workers, # 指定使用2個工作進程加載數據imgsz=640, # 指定輸入圖像的大小為640x640epochs=120, # 指定訓練100個epochbatch=batch, # 指定每個批次的大小為8name='train_v8_' + data_name # 指定訓練任務的名稱)
????????在讀取YAML配置文件后,我們對其進行了必要的路徑修改,以確保訓練時能夠正確地找到數據集的位置。這是一個常見的預處理步驟,以確保配置文件與實際數據存儲位置一致。然后,我們加載了預訓練的YOLOv8模型,并開始了訓練過程。這里使用YOLO類創建模型實例,并通過train方法啟動訓練過程。在訓練中,我們指定了圖像大小、訓練周期數、批次大小以及訓練任務的名稱。這些參數將指導模型的訓練過程,從而對模型進行優化。
????????在我們的YOLOv8模型訓練過程中,損失函數和性能指標的監測對于理解模型的學習進度和行為至關重要。通過深入分析訓練和驗證階段的損失函數圖像,我們可以對模型的性能做出細致的評估。
????????我們觀察到訓練和驗證的框損失(box_loss)都隨著訓練周期增加而顯著下降。這表明模型對于定位目標的邊界框的能力在不斷提高。特別是在訓練初期,損失函數值的下降速度較快,隨后趨于平穩。這是模型逐漸適應數據分布并學習到有效特征的標志。驗證集上的框損失稍高于訓練集,這是正常現象,因為模型在未見過的數據上通常表現略差。
????????接著,類別損失(cls_loss)和目標損失(df1_loss)也表現出類似的下降趨勢。類別損失的下降意味著模型在區分不同類別的能力上有所提升,而目標損失的減少則反映出模型在預測目標是否存在方面的準確度在提高。然而,我們注意到,在某些訓練階段,這兩種損失會出現輕微的波動,這可能是由于學習率的調整或是模型在某些困難樣本上的過擬合。
????????精度(precision)和召回率(recall)是評估檢測模型性能的重要指標。在我們的分析中,精度隨著訓練的進行呈現出逐步上升的趨勢,這說明模型越來越少地將非目標誤判為目標。召回率的提高則表明模型遺漏檢測目標的情況在減少,它能夠檢測到更多的真實目標。兩者的平衡對于實際應用至關重要。
????????至于平均精度(mAP)指標,mAP@0.5和mAP@0.5:0.95都顯示了隨著訓練的進行而逐漸上升的趨勢,這表示在不同的置信度閾值下,模型的性能都在提高。特別是mAP@0.5:0.95,這個指標考慮了更為嚴格的IoU閾值,從而提供了對模型性能的全面評估。在實際應用中,高mAP值意味著模型能夠更為準確地識別和定位各種尺寸的目標。
????????F1分數是精度和召回率的調和平均值,它為我們提供了一個衡量模型分類準確性的綜合指標。在這幅圖中,每條曲線代表了不同行人車輛類別在各個置信度閾值上的F1分數,而最厚的藍色線代表了所有類別的平均F1分數。
????????下圖為博主訓練行人車輛檢測的F1曲線圖。從曲線圖中可以看到,各個類別的F1分數隨置信度閾值的變化呈現出典型的“山峰”形態。這意味著對于每個類別,存在一個置信度閾值,在這個點上模型達到了精確度和召回率的最佳平衡。例如,對于“person”類別,我們可以看到F1分數在某個置信度閾值附近達到峰值,這說明模型在這個閾值下對于檢測行人的性能最佳。而對于其他類別,如“bicycle”、“car”、“motorcycle”等,我們也觀察到類似的趨勢,盡管它們達到峰值的具體置信度閾值有所不同。
???????? 值得注意的是,不同類別的F1分數峰值并不相同,這反映出模型在不同類別上的檢測性能存在差異。例如,“car”類別的F1分數曲線高于“bicycle”,這可能是因為汽車目標在圖像中通常較大,特征更明顯,因此更容易被模型準確檢測。而對于較小或細長的目標,如“bicycle”,模型可能需要更精細的特征學習能力來提高檢測性能。
???????? 整體來看,所有類別的F1分數曲線在置信度閾值約為0.35時匯聚,并在這一點上達到一個綜合峰值。這表明,在這個置信度閾值下,模型對于所有類別的平均性能達到最優。實際應用中,可以考慮將這一置信度閾值作為默認設置,以平衡模型對各類目標的檢測精確度和召回率。然而,曲線圖也顯示,當置信度閾值非常高或非常低時,F1分數顯著下降。當置信度閾值過低時,模型傾向于將更多的非目標區域誤判為目標,導致精確度下降;而當置信度閾值過高時,模型則可能錯過一些實際的目標,導致召回率下降。因此,選擇一個適中的置信度閾值對于實現最佳檢測效果至關重要。
???????? 綜上所述,通過對F1分數曲線圖的分析,我們可以深入了解YOLOv8模型在不同類別上的性能表現,并確定最適合的置信度閾值。這些分析對于模型的優化調整以及后續在實際場景中的部署具有重要指導意義。通過精細的性能調優,我們的目標檢測模型將能夠在多樣化的應用場景中實現更為精確和可靠的目標檢測。
4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8對比
(1)實驗設計:
????????本實驗旨在評估和比較YOLOv5、YOLOv6、YOLOv7和YOLOv8幾種模型在行人車輛目標檢測任務上的性能。為了實現這一目標,博主分別使用使用相同的數據集訓練和測試了這四個模型,從而可以進行直接的性能比較。該數據集包含行人車輛的圖像。本文將比較分析四種模型,旨在揭示每種模型的優缺點,探討它們在工業環境中實際應用的場景選擇。
模型 | 圖像大小 (像素) | mAPval 50-95 | CPU ONNX 速度 (毫秒) | A100 TensorRT 速度 (毫秒) | 參數數量 (百萬) | FLOPs (十億) |
---|---|---|---|---|---|---|
YOLOv5nu | 640 | 34.3 | 73.6 | 1.06 | 2.6 | 7.7 |
YOLOv8n | 640 | 37.3 | 80.4 | 0.99 | 3.2 | 8.7 |
YOLOv6N | 640 | 37.5 | - | - | 4.7 | 11.4 |
YOLOv7-tiny | 640 | 37.4 | - | - | 6.01 | 13.1 |
(2)度量指標:
- F1-Score:F1-Score是精確率(Precision)和召回率(Recall)的調和平均值。精確率是指模型正確識別的正例與所有識別為正例的案例之比,而召回率是指模型正確識別的正例與所有實際正例之比。F1-Score對于不平衡的數據集或者需要同時考慮精確率和召回率的任務特別重要。
- mAP(Mean Average Precision):mAP是衡量模型在多個類別上平均檢測準確度的指標。它計算了模型在所有類別上的平均精度,是目標檢測領域中常用的性能度量。
名稱 | YOLOv5nu | YOLOv6n | YOLOv7-tiny | YOLOv8n |
---|---|---|---|---|
mAP | 0.565 | 0.640 | 0.493 | 0.574 |
F1-Score | 0.57 | 0.64 | 0.53 | 0.58 |
(3)實驗結果分析:
??????? 在本節中,我們將對YOLO系列中的幾個版本——YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n——在相同數據集上的性能進行對比分析,基于兩個核心的度量指標:平均精度(mAP)和F1-Score。
??????? mAP是衡量目標檢測模型在所有類別上平均性能的一個標準度量,它同時考慮了精確度和召回率。實驗結果顯示,YOLOv6n在這四個模型中以0.640的mAP得分最高,這表明它在整體上具有最佳的檢測性能,能夠在多個類別上平衡地識別和定位目標。YOLOv5nu和YOLOv8n的表現相對接近,分別達到了0.565和0.574的mAP得分。雖然YOLOv8n在版本上更加新穎,但其性能提升并不顯著,這可能是因為在特定的數據集和任務上,新版本的優化并未完全發揮出預期效果。而YOLOv7-tiny的表現最差,僅有0.493的mAP得分,這可能是由于“tiny”版本的模型更小、更快,但通常犧牲了一些精度,特別是在多類別和復雜場景的數據集上。
??????? 接下來是F1-Score的分析,這是精確度和召回率的調和平均數,是判斷單個模型性能的關鍵指標。F1-Score將精確度和召回率結合成一個單一的度量,提供了對模型性能的直觀理解。在F1-Score方面,YOLOv6n以0.64的得分繼續領先,這與mAP得分的趨勢一致,進一步證明了其在該數據集上的優秀性能。YOLOv8n以0.58的F1-Score緊隨其后,展現出其較新架構的競爭力。YOLOv5nu的得分為0.57,略低于YOLOv8n,顯示出在這一版本迭代中的性能提升。YOLOv7-tiny的表現依然是最低的,得分為0.53,這強調了在追求模型大小和速度優化的同時可能會影響模型的準確性。
??????? 總的來說,YOLOv6n在這一組實驗中展現出了最佳的綜合性能,而YOLOv7-tiny在追求效率的同時犧牲了一定的精度。YOLOv8n作為最新版本,在某些方面有所提升,但在性能上的增長并不如期顯著,這提示我們在選擇模型時應綜合考慮性能與實際應用需求。此外,我們還應意識到,不同的模型可能需要不同的優化策略和超參數調整來充分利用其潛力,因此實驗結果可能隨著配置的不同而有所變化。通過詳細的對比分析,我們可以更好地理解每個模型的優勢和局限,為實際應用中的模型選擇和優化提供依據。
4.4 代碼實現
????????在本篇博客文章中,我們將深入探討如何運用YOLOv8模型在實際應用場景中進行目標檢測。這項任務涉及到一系列復雜的步驟,從設置運行環境、處理視頻幀,到圖像的實時展示和目標的檢測。在這個過程中,我們將使用一系列高級Python庫,包括sys、time、cv2以及自定義的QtFusion和YOLOv8Model庫。
????????在實時行人車輛檢測與計數中,結合YOLOv8模型和一系列開源庫,如OpenCV、QtFusion和PySide6等,來實現主窗口的展示、攝像頭幀的處理以及行人車輛的檢測和標注等功能。
(1)導入必要的模塊和配置
???????我們的代碼首先導入了必要的模塊,包括sys和time,它們分別用于訪問與Python解釋器相關的變量和函數以及執行與時間相關的操作。OpenCV庫(cv2)是我們處理圖像和視頻的工具。我們還使用了QtFusion庫,這是一個包含了多個模塊的庫,提供了創建用戶界面和處理媒體數據的功能。YOLOv8Model模塊中的YOLOv8Detector類是我們進行目標檢測的核心。
import random # 用于生成隨機顏色
import sys # 用于訪問Python解釋器相關的功能
import time # 用于記錄操作所需的時間
from QtFusion.config import QF_Config
import cv2 # OpenCV庫,用于圖像處理
from QtFusion.widgets import QMainWindow # 用于創建GUI窗口
from QtFusion.utils import cv_imread, drawRectBox # 輔助函數,用于圖像讀取和繪制
from PySide6 import QtWidgets, QtCore # 構建圖形用戶界面
from QtFusion.path import abs_path
from YOLOv8Model import YOLOv8Detector # YOLOv8模型,用于目標檢測
QF_Config.set_verbose(False)
????????這一部分主要負責導入各種模塊。random用于隨機顏色生成,sys和time分別用于系統操作和時間處理。cv2是圖像處理的核心,而QtFusion和PySide6則用于構建用戶界面。YOLOv8Detector是進行目標檢測的關鍵類。
(2)定義類別和模型
????????我們的模型YOLOv8Detector被初始化并加載了預訓練的權重。我們還使用了get_cls_color函數為不同的類別分配顏色,以便在圖像上用不同的顏色標記不同的對象。
cls_name = Label_list # 定義類名列表model = YOLOv8Detector() # 創建YOLOv8Detector對象
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current")) # 加載預訓練的YOLOv8模型
colors = get_cls_color(model.names) # 獲取類別顏色
(3)創建主窗口
????????代碼的主體部分定義了一個MainWindow類,這是我們應用程序的用戶界面窗口,它繼承自Qt的QMainWindow類。我們調整了窗口的大小并添加了一個標簽,用于顯示處理后的視頻幀。此外,我們為這個窗口定義了鍵盤事件處理函數,以便在按下’Q’鍵時關閉程序。
class MainWindow(QMainWindow): # 自定義主窗口類def __init__(self): # 構造函數super().__init__() # 調用父類構造函數self.resize(850, 500) # 設置窗口大小self.label = QtWidgets.QLabel(self) # 創建標簽用于顯示圖像self.label.setGeometry(0, 0, 850, 500) # 設置標簽位置和大小def keyPressEvent(self, event): # 鍵盤事件處理if event.key() == QtCore.Qt.Key.Key_Q: # 按下Q鍵時self.close() # 關閉窗口
(4)主程序流程
????????在處理視頻幀的函數frame_process中,我們對每一幀圖像進行預處理,并使用YOLOv8模型進行目標檢測。我們記錄了模型推理的時間,并打印出來,這對于評估模型性能很有幫助。如果模型在幀中檢測到目標,我們將使用輔助函數drawRectBox在圖像上繪制邊界框和標簽,并使用get_cls_color函數獲取類別對應的顏色。
def frame_process(image): # 定義幀處理函數,用于處理每一幀圖像image = cv2.resize(image, (850, 500)) # 將圖像的大小調整為850x500pre_img = model.preprocess(image) # 對圖像進行預處理t1 = time.time() # 獲取當前時間pred = model.predict(pre_img) # 使用模型進行預測t2 = time.time() # 獲取當前時間use_time = t2 - t1 # 計算預測所花費的時間print("推理時間: %.2f" % use_time) # 打印預測所花費的時間det = pred[0] # 獲取預測結果# 如果有檢測信息則進入if det is not None and len(det):det_info = model.postprocess(pred) # 對預測結果進行后處理for info in det_info: # 遍歷檢測信息name, bbox, conf, cls_id = info['class_name'], info['bbox'], info['score'], info['class_id'] # 獲取類別名稱、邊界框、置信度和類別IDlabel = '%s %.0f%%' % (name, conf * 100) # 創建標簽,包含類別名稱和置信度# 畫出檢測到的目標物image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id]) # 在圖像上繪制邊界框和標簽window.dispImage(window.label, image) # 在窗口的label上顯示圖像
????????最后,我們設置了媒體處理器來處理視頻流。當新的視頻幀準備好時,它會觸發我們定義的frame_process函數,實時處理并顯示圖像。這種設計允許我們的應用程序以高效的方式處理和展示連續的視頻幀。
app = QtWidgets.QApplication(sys.argv) # 創建QApplication對象
window = MainWindow() # 創建MainWindow對象filename = abs_path("test_media/JapanStreet.mp4", path_type="current") # 定義視頻文件的路徑
videoHandler = MediaHandler(fps=30) # 創建MediaHandler對象,設置幀率為30fps
videoHandler.frameReady.connect(frame_process) # 當有新的幀準備好時,調用frame_process函數進行處理
videoHandler.setDevice(filename) # 設置視頻源
videoHandler.startMedia() # 開始處理媒體# 顯示窗口
window.show()
# 進入 Qt 應用程序的主循環
sys.exit(app.exec())
????????整個博客文章通過逐步解讀代碼,向讀者詳細解釋了每一行的作用和目的,不僅揭示了背后的技術細節,還展示了如何將這些技術整合在一起,構建一個實用的行人車輛檢測與計數應用。我們希望這篇文章能夠啟發讀者進一步探索計算機視覺和機器學習的潛力,并在自己的項目中應用這些有價值的知識。
5. 行人車輛檢測與計數實現
????????在構建我們的交互式行人車輛檢測與識別系統時,我們采取了一種集成化的系統設計思路,旨在提供一個高效、直觀并且用戶友好的操作環境。此系統的設計理念基于模塊化的架構,使得界面層、處理層和控制層能夠緊密而清晰地協作。
5.1 系統設計思路
????????在我們的系統設計中,我們旨在構建一個集成化的交互式行人車輛檢測與計數應用程序。這個系統不僅能夠實時處理視頻流并檢測其中的行人和車輛,還能夠提供一個直觀的用戶界面,允許用戶與檢測過程進行交互。我們的設計思路圍繞三個核心層次展開:處理層、界面層和控制層,每層都有其特定的職責和功能,共同構成了一個協調一致的整體。
(1)架構設計
????????在MainWindow類的架構設計中,采用了處理層、界面層、控制層的設計模式。這個系統的設計充分考慮了用戶體驗和系統性能,通過合理的架構設計和技術選型,實現了一個高效且易于使用的行人車輛檢測與識別系統。
????????在處理層,我們利用了YOLOv8Detector類,這是一個強大的預訓練深度學習模型,專門用于圖像中的目標檢測任務。該模型以其高速和準確性而聞名,能夠實時識別視頻流中的多個目標。這一層的設計確保了我們的系統在目標檢測方面的性能,能夠快速準確地識別出行人和車輛,并提供實時反饋。
????????界面層是用戶與系統交互的前端界面。通過Qt框架,我們設計了一系列用戶界面元素,包括按鈕、標簽、顯示窗口等。這些元素不僅美觀,而且布局合理,確保用戶能夠輕松理解和使用我們的系統。通過這個層面,用戶可以啟動或停止視頻流的處理,查看檢測結果,甚至可以調整模型參數,以獲得更適合特定場景的檢測效果。
????????控制層是將界面層與處理層連接起來的橋梁。在這一層,我們通過MainWindow類實現了多個槽函數和其他控制方法。這一層的設計允許我們的應用程序響應用戶的操作,如啟動視頻處理、停止視頻流、保存檢測結果等。此外,我們還利用Qt的信號和槽機制來實現模塊間的通信,如將處理層的檢測結果實時更新到界面層的顯示窗口中。
????????總之,我們的系統設計采用了模塊化和層次化的方法,確保了每個部分都能專注于其核心功能,同時通過精心設計的交互機制確保了不同部分之間高效的協同工作。通過這種設計,我們的應用程序不僅能夠高效地執行行人和車輛的檢測任務,還能夠提供一流的用戶體驗,讓用戶可以直觀、方便地與系統進行交互。
(2)系統流程
????????在我們的最新博客中,我們將深入討論一個集成了YOLOv8模型的交互式行人車輛檢測與計數系統的設計流程。整個系統是圍繞用戶友好和高效能目標檢測構建的,它通過一系列精心設計的步驟,為用戶提供了一個直觀且強大的應用程序界面。
-
當用戶啟動應用程序時,系統首先實例化MainWindow類,這一步驟是整個應用的核心。MainWindow類不僅初始化了用戶界面,布局了操作按鈕和展示窗口,還設定了應用的主要參數。這個起點為用戶提供了一個清晰的操作路徑,指引他們開始使用應用程序進行目標檢測。
-
用戶通過主界面選擇輸入源,這是系統靈活性的體現。無論是攝像頭捕捉的實時圖像、視頻文件還是靜態圖片,系統都提供了相應的支持。這種多輸入源的兼容性確保了應用程序可以適用于不同的使用場景,從實時監控到后期視頻分析,都能夠滿足用戶的需求。
-
輸入源被確定后,應用程序調用媒體處理器和方法開始處理輸入數據。無論是配置攝像頭、讀取視頻文件還是加載圖像文件,都涉及到一系列的數據處理步驟。這些步驟保證了數據在送入模型前處于最佳狀態,為后續的檢測和識別打下了堅實的基礎。
-
媒體輸入源準備就緒后,系統進入連續幀處理的循環。這個流程開始于圖像的預處理,其中可能包括調整圖像大小、轉換色彩空間和歸一化等操作,以確保輸入圖像滿足YOLO模型的需求。隨后,在檢測與識別階段,預處理后的圖像被送入經過精細訓練的YOLOv8模型進行分析,模型準確地輸出了行人和車輛的位置及其數量。
-
當檢測結果產生后,界面實時更新,不僅展示了檢測框,還標注了類別,并在界面的展示區域中展示了檢測統計數據。這些實時的視覺反饋增強了用戶體驗,使得用戶可以直觀地觀察并理解模型的檢測結果。
-
此外,用戶還可以通過界面與系統進行互動。通過簡單的按鈕操作,用戶可以保存結果、查詢信息,甚至通過界面提供的篩選和分析工具深入探究特定的檢測數據。這些交互功能大大提高了應用的實用性,并賦予用戶更大的控制權。
????????最后,系統還提供了對媒體播放狀態的控制。用戶可以自由地啟動或停止媒體捕捉、視頻播放或圖像分析,這提供了操作的靈活性,使用戶能夠根據自己的需求來調節應用程序的行為。
????????整個系統的設計理念是以用戶為中心,通過高效的目標檢測技術、直觀的界面設計和強大的交互功能,為用戶提供了一個全面的行人車輛檢測解決方案。無論是公共安全監控、交通流量分析還是其他需要目標檢測的場合,這個系統都能夠提供出色的性能和優秀的用戶體驗。通過這種綜合性的設計,我們的系統不僅能夠滿足專業領域的需求,也易于普通用戶的日常使用。
5.2 登錄與賬戶管理
????????在我們的行人車輛檢測與計數系統中,用戶體驗始終是我們設計的核心。為了提供一個安全且私有的環境,我們整合了一套完整的用戶賬戶管理系統,這一系統基于PySide6框架構建,并使用SQLite數據庫作為后端存儲。這不僅僅是為了保護用戶的個人信息,還能夠讓用戶在我們的平臺上擁有個性化的體驗。
????????首先,用戶會遇到一個簡潔而直觀的登錄界面,這是他們與我們系統交互的第一步。在這里,新用戶可以注冊一個全新的賬戶,而現有用戶可以通過輸入用戶名和密碼來登錄。注冊過程設計得既快捷又安全,確保用戶能夠輕松地開始他們的檢測任務。一旦登錄,用戶就可以進入系統的主界面,開始行人車輛的檢測與計數工作。
????????賬戶管理功能不僅限于登錄和注冊。用戶可以在賬戶中心修改密碼,保證賬戶安全;更新頭像,增添個性化元素;甚至注銷賬戶,確保其數據的私密性。這些功能的集成,為用戶提供了一個可以定制的平臺,使他們能夠根據個人喜好和需求調整系統設置。
????????進一步地,我們的系統允許用戶保存和管理自己的檢測結果和設置。這意味著用戶可以回顧過去的檢測記錄,分析檢測趨勢,或者導出數據用于進一步的分析。這些記錄會與用戶的賬戶關聯,因此用戶可以放心地知道自己的數據是安全和私有的。
????????至于檢測功能本身,我們的系統不僅支持圖片和視頻輸入,還支持實時攝像頭捕捉和批量文件處理。這樣的多輸入方式為用戶提供了極大的便利性,無論是要處理實時交通流量監控,還是分析歷史視頻資料,我們的系統都能夠滿足需求。在主界面中,用戶可以實時看到檢測框、類別及置信度等關鍵信息,這些實時反饋為用戶提供了直觀的監控體驗。
????????總而言之,我們的系統設計考慮了用戶操作的便捷性、個性化設置的需求以及數據管理的安全性。通過這些考慮,我們為用戶提供了一個功能強大、易于使用且高度私有的行人車輛檢測與計數工具。無論用戶是安全監控的專業人員,還是交通管理的研究者,甚至是對機器學習感興趣的愛好者,我們的系統都能為他們提供優質的服務。
下載鏈接
????若您想獲得博文中涉及的實現完整全部資源文件(包括測試圖片、視頻,py, UI文件,訓練數據集、訓練代碼、界面代碼等),這里已打包上傳至博主的面包多平臺,見可參考博客與視頻,已將所有涉及的文件同時打包到里面,點擊即可運行,完整文件截圖如下:
完整資源中包含數據集及訓練代碼,環境配置與界面中文字、圖片、logo等的修改方法請見視頻,項目完整文件下載請見演示與介紹視頻的簡介處給出:???
演示與介紹視頻:https://www.bilibili.com/video/BV1vy421B7Zm/
????在文件夾下的資源顯示如下,下面的鏈接中也給出了Python的離線依賴包,讀者可在正確安裝Anaconda和Pycharm軟件后,復制離線依賴包至項目目錄下進行安裝,另外有詳細安裝教程:(1)Pycharm軟件安裝教程;(2)Anaconda軟件安裝教程;(3)Python環境配置教程;
離線依賴安裝教程:https://www.bilibili.com/video/BV1hv421C7g8/
離線依賴庫下載鏈接:https://pan.baidu.com/s/1y6vqa9CtRmC72SQYPh1ZCg?pwd=33z5 (提取碼:33z5)
6. 總結與展望
????????在本博客中,我們詳細介紹了一個基于YOLOv8模型的行人車輛檢測與計數,還實驗了YOLOv7、YOLOv6、YOLOv5等模型。系統以模塊化的方式設計,充分采用了合理的架構設計,帶來良好的可維護性和可擴展性。其用戶界面友好,能夠提供實時的行人車輛檢測和識別結果展示,同時支持用戶賬戶管理,以便于保存和管理檢測結果和設置。
????????該系統支持攝像頭、視頻、圖像和批量文件等多種輸入源,能夠滿足用戶在不同場景下的需求。在后面可以添加更多預訓練模型,增加檢測和識別的種類;優化用戶界面,增強個性化設置;并積極聆聽用戶反饋,以期不斷改進系統,以更好地滿足用戶的需求。
結束語
????????由于博主能力有限,博文中提及的方法即使經過試驗,也難免會有疏漏之處。希望您能熱心指出其中的錯誤,以便下次修改時能以一個更完美更嚴謹的樣子,呈現在大家面前。同時如果有更好的實現方法也請您不吝賜教。
Talaat F M, ZainEldin H. An improved fire detection approach based on YOLO-v8 for smart cities[J]. Neural Computing and Applications, 2023, 35(28): 20939-20954. ??
Han K, Wang Y, Chen H, et al. A survey on vision transformer[J]. IEEE transactions on pattern analysis and machine intelligence, 2022, 45(1): 87-110. ??
Wang C Y, Bochkovskiy A, Liao H Y M. YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2023: 7464-7475. ??
. Li C, Li L, Jiang H, et al. YOLOv6: A single-stage object detection framework for industrial applications[J]. arXiv preprint arXiv:2209.02976, 2022. ??
Wu W, Liu H, Li L, et al. Application of local fully Convolutional Neural Network combined with YOLO v5 algorithm in small target detection of remote sensing image[J]. PloS one, 2021, 16(10): e0259283. ??