摘要:開發停車位檢測系統對于優化停車資源管理和提升用戶體驗至關重要。本篇博客詳細介紹了如何利用深度學習構建一個停車位檢測系統,并提供了完整的實現代碼。該系統基于強大的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界面+訓練代碼)
前言
????????在當今社會,隨著汽車保有量的持續增加,城市停車成為了一個日益嚴峻的問題。特別是在商業中心、居民區和辦公區域,尋找空閑停車位往往耗時耗力,不僅給駕駛者帶來了極大的不便,也加劇了城市交通擁堵,增加了環境污染。在這樣的背景下,停車位檢測系統的研究和開發顯得尤為重要。它通過自動化技術實時檢測停車場或停車區的空閑停車位,極大地提高了停車效率,減少了尋找停車位的時間,對于緩解城市交通壓力、提升城市生活品質具有重要意義。
????????近年來,隨著深度學習技術的快速發展,基于YOLO(You Only Look Once)系列算法的停車位檢測系統尤其受到研究者的關注。YOLO算法因其快速且準確的特性,在實時物體檢測領域表現出色。從YOLOv5到YOLOv8,每一個版本的迭代都帶來了算法性能的顯著提升,包括檢測精度的提高和處理速度的加快,這對于需要實時反饋的停車位檢測系統來說至關重要。此外,結合其他最新類型的算法改進和技術進展,如卷積神經網絡的優化、數據增強技術的應用,以及更為豐富和精確的數據集更新,都極大地推動了停車位檢測技術的發展。
????????從最早的YOLO1,到YOLO90002,再到YOLOv43,YOLOv5等,這一系列的發展都在推動著目標檢測技術的進步。在去年美團發布了YOLOv64,然后緊接著YOLOv75,到現在的YOLOv86,這個最新版本在許多方面都進行了優化與改進,如使用了更復雜的網絡架構,更精細的預測機制,以及加入了對小目標的更好處理。
????????除了YOLO系列,其他算法如SSD和Faster R-CNN也在停車位檢測領域中有所應用,但由于YOLO系列在速度和準確度上的優勢,更受研究社區的歡迎。近年來,研究者還嘗試將YOLO算法與其他技術相結合,如GANs(生成對抗網絡)和強化學習,以進一步提高停車位檢測系統的準確率和魯棒性。
????????當前的研究不僅聚焦于算法本身的改進,還包括數據集的更新和擴充、性能評估標準的完善,以及對特定挑戰(如不同光照條件、遮擋情況)的應對策略。這些研究的目的是使停車位檢測系統更加準確、可靠和適應多變的環境條件。面對技術挑戰,研究者們正致力于解決包括但不限于算法的實時性、在復雜場景下的準確性、以及系統的可擴展性和可維護性等問題。隨著技術的進步和新算法的出現,停車位檢測系統的性能有望進一步提升,為解決城市停車難題提供更有效的解決方案。
????????盡管面臨挑戰,但通過不斷的技術創新和跨學科研究,停車位檢測系統的發展前景仍然被看好。未來的研究可能會集中在提高系統的泛化能力、減少對大量標注數據的依賴、以及開發更加節能的模型上,以實現更廣泛的應用和部署。
????????本博客通過詳細介紹一個基于YOLOv8算法的停車位檢測系統的開發和實現,旨在為深度學習和目標檢測領域的研究者和從業者提供一個全面的研究和應用示例。本文的貢獻可以概括如下:
- 采用最先進的YOLOv8算法進行停車位檢測:本文首次在停車位檢測系統中引入了YOLOv8算法,并詳細介紹了其實現過程和原理。通過與YOLOv7、YOLOv6、YOLOv5等早期版本的對比分析,展示了YOLOv8在效率和精確度上的顯著優勢。這一工作不僅為停車位檢測提供了一個更為高效和準確的技術方案,也為后續研究者提供了寶貴的參考和啟示。
- 利用PySide6實現友好的用戶界面:本文展示了如何運用PySide6庫開發出一個既美觀又易于操作的停車位檢測系統界面。該界面設計考慮了用戶的操作習慣和體驗,使得停車位檢測變得更加直觀和便捷。這一創新不僅提升了用戶體驗,也促進了YOLOv8算法在實際應用場景中的廣泛應用。
- 集成登錄管理功能以提升系統安全性:系統中新增的登錄管理功能,增強了系統的安全性,同時為將來添加更多個性化功能留出了空間。這表明本研究不僅關注于算法的性能優化,也重視用戶體驗和系統的實用性。
- 對YOLOv8模型的深入分析與評估:本文不僅介紹了YOLOv8算法的應用,還對模型的性能進行了全面的分析和評估,包括精確度、召回率等關鍵性能指標,以及模型在不同環境條件下的適應性。這些深入的分析為進一步優化YOLOv8算法,提升停車位檢測的準確性和魯棒性提供了堅實的基礎。
- 提供完整的數據集和代碼資源包:為了便于讀者更好地理解、復現和進一步研究,本文提供了一套完整的數據集和代碼資源包。這些資源的分享,不僅降低了讀者進行相關研究的門檻,也有助于促進技術的開放交流和快速迭代。
1.數據集介紹
????????在構建一個高效且準確的停車位檢測系統時,一個精心設計的數據集是至關重要的。我們的數據集共包含7801張圖像,其中6017張用于模型訓練,726張用于模型測試,以及1058張用于模型驗證。這種劃分確保了我們的模型在不同數據子集上都有良好的表現,并且可以公正地評估其泛化能力。我們的數據集不僅在數量上可觀,而且在多樣性上也具備優勢。它包含了各種不同的停車環境,如室內外、不同的光照條件以及各種角度拍攝的停車場景。這些多樣化的場景對于訓練一個魯棒的停車位檢測模型至關重要,因為它們使得模型能夠適應現實世界中的各種條件。
????????在預處理階段,所有圖像均經過自動方向調整,并剝離了EXIF信息中的方向標簽,以確保所有圖像的方向一致。此外,每張圖像都被統一調整到了640x640像素的大小,這不僅有利于減少模型訓練和推斷過程中的計算負擔,而且保證了不同圖像在尺度上的統一。這些預處理步驟為模型訓練提供了一致和標準化的輸入,是高效學習的前提。
????????在數據集的標注方面,我們采用了精確的標注框來標識每個停車位的位置,并對其進行了“empty”(空閑)和“occupied”(占用)的分類。這種詳細的標注為訓練深度學習模型提供了必要的真實世界情境,允許模型學習如何區分不同狀態的停車位。值得注意的是,數據集中“occupied”狀態的停車位數量多于“empty”狀態,這可能需要在模型訓練時采用類別平衡技術以避免偏差。
????????進一步分析數據集的標注框分布,我們發現大多數停車位標注集中在圖像的中心區域,這反映了攝影時的一致性以及停車位在空間上的規律性。同時,停車位標注的大小分布相對集中,這說明我們可以在模型的錨框設計中利用這一特性,選擇合適的尺度和比例來更好地匹配實際的停車位尺寸。博主使用的類別代碼如下:
Chinese_name = {'empty': "空車位", 'occupied': "已泊車"}
????????綜上所述,我們的數據集在規模、多樣性、預處理、標注質量和詳細程度方面都經過了精心設計和優化,以支持開發和評估先進的停車位檢測系統。通過提供這些詳細的介紹,我們希望能夠幫助研究人員和開發者更好地理解和利用我們的數據集,進而在停車位檢測這一關鍵領域中取得突破。
2. 系統界面效果
????????系統以PySide6作為GUI庫,提供了一套直觀且友好的用戶界面。下面,我將詳細介紹各個主要界面的功能和設計。
(1)系統提供了基于SQLite的注冊登錄管理功能。用戶在首次使用時需要通過注冊界面進行注冊,輸入用戶名和密碼后,系統會將這些信息存儲在SQLite數據庫中。注冊成功后,用戶可以通過登錄界面輸入用戶名和密碼進行登錄。這個設計可以確保系統的安全性,也為后續添加更多個性化功能提供了可能性。
(2)在主界面上,系統提供了支持圖片、視頻、實時攝像頭和批量文件輸入的功能。用戶可以通過點擊相應的按鈕,選擇要進行停車位檢測的圖片或視頻,或者啟動攝像頭進行實時檢測。在進行停車位檢測時,系統會實時顯示檢測結果,并將檢測記錄存儲在數據庫中。
(3)此外,系統還提供了一鍵更換YOLOv8/v5模型的功能。用戶可以通過點擊界面上的"更換模型"按鈕,選擇不同的YOLOv8模型進行檢測。與此同時,系統附帶的數據集也可以用于重新訓練模型,以滿足用戶在不同場景下的檢測需求。
(4)為了提供更個性化的使用體驗,這里系統支持界面修改,用戶可以自定義圖標、文字等界面元素。例如,用戶可以根據自己的喜好,選擇不同風格的圖標,也可以修改界面的文字描述。
3. YOLOv8算法原理
????????YOLOv8算法繼承并發展了其前輩YOLO系列算法的優點,是一種高效的實時目標檢測算法。這一版本在架構上做了多項創新,進一步提升了檢測速度和準確性,使其在實際應用中更加強大和靈活。YOLOv8的架構采用了CSP Bottleneck with 3 convolutions結構,這是其前身YOLOv5結構的進一步演變。CSP即Cross Stage Partial networks,它的設計理念是將網絡的層次分割成多個部分,從而減少計算量和提高信息流的速度。在YOLOv8中,CSP結構通過三個卷積層來實現,這三個卷積層分別負責提取特征圖的不同部分,然后將這些部分再次合并,這樣做的好處是可以在保持高性能的同時減少模型的參數數量,從而減輕了計算負擔,加速了訓練和推理過程。
???????? 此外,YOLOv8還采用了CSP Bottleneck with 2 convolutions結構,在這個結構中,Bottleneck部分由兩個卷積層組成。這種設計有效地提升了網絡的特征提取能力,并且在降低計算量的同時提高了特征的利用率。
????????在卷積層后,YOLOv8繼續采用了批量歸一化(Batch Normalization, BN)和SILU激活函數。批量歸一化有助于網絡訓練過程中的穩定性,通過規范化層的輸入,可以加快訓練速度,提高模型的收斂速度。SILU激活函數(也稱為SiLU或者Swish),是一種非線性激活函數,它比傳統的ReLU函數有更好的性能,因為它能夠在負輸入值時仍然提供一定的輸出,這有助于保持網絡中信息的流動,避免了梯度消失的問題。
????????在損失函數方面,YOLOv8采用了GFL(Generalized Focal Loss)。這種損失函數是對傳統的Focal Loss的泛化,它對正負樣本的分類問題進行動態調整,有助于模型更加聚焦于困難樣本,即那些模型預測不確定性較高的樣本。這有助于提高模型對小目標和在復雜背景中目標的檢測能力。另外,YOLOv8還引入了DFL(Distribution Focal Loss),這是一種新的損失函數,專門針對目標檢測中的分類問題。DFL關注于概率分布,幫助模型在預測時考慮到每個類別的概率分布,從而提高分類的準確性。
????????最后,YOLOv8通過Ghost模塊進一步優化網絡,這種模塊通過在計算過程中生成更多的特征圖副本(即"ghost"特征圖),有效減少了計算量并提高了信息的多樣性。這種技術使得網絡能夠在不顯著增加計算成本的情況下,提供更豐富的特征表示,從而提高了檢測性能。
????????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庫,包括操作系統交互(os),解析YAML文件(yaml),以及Ultralytics的YOLO模型。YAML文件通常用于存儲配置信息,如數據集路徑、類別信息等。
import os
import yaml
from ultralytics import YOLO # 導入YOLO模型
from QtFusion.path import abs_path
????????接下來,代碼確保只有當該模塊作為主程序運行時,才執行訓練代碼。然后,它定義了數據集的名稱,并使用abs_path函數獲得YAML配置文件的絕對路徑。unix_style_path用于確保路徑格式在不同操作系統間兼容。在讀取YAML文件之前,代碼首先獲取了YAML文件所在的目錄路徑。通過打開并讀取YAML文件,代碼能夠加載數據集的配置。為了確保路徑的正確性,如果path項存在于YAML文件中,代碼將其更新為目錄路徑。所有這些步驟都是為了確保模型訓練時數據的正確加載。
if __name__ == '__main__': # 確保該模塊被直接運行時才執行以下代碼data_name = "ParkingSpacesv2"data_path = abs_path('datasets/ParkingSpacesv2/parkingv2.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)workers = 1batch = 8model = 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='0', # 指定使用CPU進行訓練workers=workers, # 指定使用2個工作進程加載數據imgsz=640, # 指定輸入圖像的大小為640x640epochs=100, # 指定訓練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='0', # 指定使用CPU進行訓練workers=workers, # 指定使用2個工作進程加載數據imgsz=640, # 指定輸入圖像的大小為640x640epochs=100, # 指定訓練100個epochbatch=batch, # 指定每個批次的大小為8name='train_v8_' + data_name # 指定訓練任務的名稱)
????????在配置了數據路徑后,代碼繼續設置訓練參數。workers定義了數據加載時使用的進程數,而batch定義了每批次訓練的圖像數量。之后,代碼加載了預訓練的YOLOv8模型并開始了訓練過程,設置了設備、工作進程、圖像大小、訓練周期和批次大小等參數。代碼還展示了如何加載另一個預訓練模型YOLOv8并進行訓練,這顯示了如何靈活地在不同版本的YOLO模型之間進行切換。
????????損失函數圖顯示了訓練集和驗證集上的三種損失:box_loss、cls_loss和dfl_loss。box_loss表示邊框回歸損失,即模型預測的邊框與真實邊框之間的差異;cls_loss是分類損失,指模型對于停車位狀態(空閑或占用)分類的準確性;dfl_loss是分布式焦點損失,它是YOLOv8特有的,用于處理分類不平衡的問題。從圖中可以看出,隨著訓練過程的進行,所有三種損失都呈現出明顯的下降趨勢,這表明模型在逐漸學習并改進其對停車位的定位和分類能力。值得注意的是,訓練集和驗證集上的損失趨勢保持一致,這說明模型沒有出現過擬合現象,具有較好的泛化能力。
????????評價指標圖包括了precision(精確率)、recall(召回率)、mAP50(在IoU閾值為0.5時的平均精度)和mAP50-95(在IoU閾值從0.5到0.95的平均精度)。這些指標反映了模型檢測性能的不同方面。精確率顯示了模型正確檢測到的停車位占所有模型檢測到的停車位的比例,而召回率則顯示了模型正確檢測到的停車位占所有實際停車位的比例。mAP50和mAP50-95則提供了更全面的性能評估,其中mAP50-95考慮了更嚴格的IoU閾值,因此更能體現模型的整體性能。從圖中我們可以看到,隨著訓練的進行,精確率和召回率都逐漸上升,表明模型在不斷提高其檢測的準確性和完整性。mAP指標同樣顯示出上升趨勢,尤其是mAP50-95的提升,表明模型對于不同大小和形態的停車位都有良好的檢測能力。
????????YOLOv8模型在停車位檢測任務上展現出了優秀的訓練效果。損失函數的下降和評價指標的提升充分證明了模型的有效性和穩健性。通過這些圖表的詳盡分析,我們可以更加自信地將YOLOv8模型應用于實際的停車位檢測場景中,以期望獲得高準確率和高穩定性的檢測結果。
????????F1分數是精確率和召回率的調和平均,是評估模型性能的重要指標,尤其是在分類任務中。它的最佳值為1,最差值為0。從提供的F1分數曲線圖中,我們可以看到兩個類別:‘empty’(空閑)和’occupied’(占用),以及所有類別的綜合F1分數。這種曲線圖幫助我們理解在不同置信度閾值下模型性能的變化。
???????? 在圖中可以觀察到,隨著置信度閾值的提高,兩個類別的F1分數曲線先是上升然后開始下降。'empty’類別和’occupied’類別的曲線在大部分置信度區間內都非常接近,這表明模型對于檢測空閑和占用的停車位具有相似的性能。此外,當置信度閾值在0.5左右時,兩個類別的F1分數達到高峰,表明這是模型判斷空閑和占用狀態的最佳置信度區間。
???????? 對于所有類別的綜合F1分數,在置信度約為0.488時達到了0.96的高值。這個結果非常出色,意味著模型在這一置信度閾值下能夠非常好地平衡精確率和召回率,實現了對停車位狀態的準確檢測。然而,隨著置信度閾值的繼續提高,F1分數開始急劇下降,這可能是由于模型對于部分樣本過于自信,導致了較高的假正例(false positives)或假負例(false negatives)。
????????這些觀察結果對于模型的實際應用至關重要。它們表明,在部署模型前,我們需要仔細選擇置信度閾值,以確保模型在實際使用時能夠保持高準確率。同時,這也提示我們可能需要對模型進行進一步的調整或后處理,比如在置信度較低時采取一些策略來降低假負例,或在置信度較高時降低假正例。
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.980 | 0.953 | 0.832 | 0.981 |
F1-Score | 0.95 | 0.91 | 0.77 | 0.96 |
(3)實驗結果分析:
??????? 在此實驗中,我們選擇了YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n四個模型進行比較。每個模型都在同一數據集上進行訓練和測試,以確保結果的可比性。我們使用了兩個關鍵的度量指標:mAP和F1-Score。
??????? 首先,讓我們看看mAP值。YOLOv5nu和YOLOv8n在這個指標上表現相當,分別達到了0.980和0.981的高分,這表明兩者在目標檢測任務上具有出色的精度和魯棒性。YOLOv6n的表現略低于這兩者,mAP為0.953,雖然略低,但仍然表現出較高的檢測能力。而YOLOv7-tiny的表現最低,mAP為0.832,這可能是因為"tiny"版本的模型更輕量級,雖然速度較快,但在檢測精度上有所犧牲。
???????對于F1分數,這是一個綜合考量精確率和召回率的指標,YOLOv8n以0.96的得分領先,這意味著在精確地識別正類實例和最小化錯誤識別上,YOLOv8n的平衡性最好。YOLOv5nu緊隨其后,F1分數為0.95,仍然顯示出極強的性能。而YOLOv6n和YOLOv7-tiny的F1分數分別為0.91和0.77,顯示出在保持較高精確率和召回率的平衡上有所挑戰,尤其是YOLOv7-tiny,在這個指標上可能受到其簡化網絡結構的影響。
???????這些數據揭示了不同YOLO版本在性能上的差異。YOLOv8n的最新架構和優化,在這個實驗中顯示出了最優的性能。盡管YOLOv5nu緊隨其后,但YOLOv8n在細微的性能提升上顯現出了其架構改進的成果。YOLOv6n作為這個系列中的一個中間版本,展現了均衡的性能。而YOLOv7-tiny,作為一種為速度優化的輕量級模型,雖然在速度上有優勢,但在精度上有所犧牲,這在需要高精度檢測的場景下是一個需要考量的權衡。
???????在選擇適合自己應用場景的模型時,我們需要根據性能指標以及實際應用的需求(如速度、準確度和計算資源)來做出決策。例如,如果實時性要求不是特別高,可以考慮使用YOLOv5nu或YOLOv8n。如果對速度有極致要求,而可以接受一定程度上精度的犧牲,則YOLOv7-tiny可能是一個不錯的選擇。而在一個資源限制且需要較高準確度的環境下,YOLOv6n可能是一個折中的選擇。通過這樣的對比分析,我們可以更好地理解各個模型的性能和適用場景,為實際應用中的模型選擇提供指導。
4.4 代碼實現
????????在這篇博客中,我們將深入探討如何利用Python和一系列強大的庫來實現一個基于YOLOv8的實時物體檢測系統。整個系統構建在強大的計算機視覺庫OpenCV和先進的深度學習模型YOLOv8上,同時融合了Qt框架來創建用戶界面。
????????在實時停車位檢測系統中,需要結合YOLOv8模型和一系列開源庫,如OpenCV、QtFusion和PySide6等,來實現主窗口的展示、攝像頭幀的處理以及停車位的檢測和標注等功能。
(1)導入必要的模塊和配置
????????首先,我們引入必要的Python庫。sys庫提供對解釋器相關功能的訪問,而time庫則用于跟蹤模型推理的時間。OpenCV庫作為圖像處理的核心,PySide6則從Qt庫中引入,用于搭建圖形用戶界面。此外,我們還導入了QtFusion庫,它是基于Qt的一個工具集,用于簡化多媒體處理和窗口管理。
import random # 導入random模塊,用于生成隨機數
import sys # 導入sys模塊,用于訪問與Python解釋器相關的變量和函數
import time # 導入time模塊,用于處理時間
from QtFusion.config import QF_Config
import cv2 # 導入OpenCV庫,用于處理圖像
from QtFusion.widgets import QMainWindow # 從QtFusion庫中導入FBaseWindow類,用于創建窗口
from QtFusion.utils import cv_imread, drawRectBox # 從QtFusion庫中導入cv_imread和drawRectBox函數,用于讀取圖像和繪制矩形框
from PySide6 import QtWidgets, QtCore # 導入PySide6庫中的QtWidgets和QtCore模塊,用于創建GUI
from QtFusion.path import abs_path
from YOLOv8Model import YOLOv8Detector # 從YOLOv8Model模塊中導入YOLOv8Detector類,用于加載YOLOv8模型并進行目標檢測
QF_Config.set_verbose(False)
????????這一部分主要負責導入各種模塊。random用于隨機顏色生成,sys和time分別用于系統操作和時間處理。cv2是圖像處理的核心,而QtFusion和PySide6則用于構建用戶界面。
(2)定義類別和模型
????????在這段代碼中,我們定義了兩個類別名稱:空車位和已泊車。每個類別對應的顏色是隨機生成的,以便在圖像上以不同的顏色標識不同類別的檢測結果。然后創建了YOLOv8Detector對象并加載了模型權重。
cls_name = ["空車位", "已泊車"] # 定義類名列表
colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(cls_name))] # 為每個目標類別生成一個隨機顏色model = YOLOv8Detector() # 創建YOLOv8Detector對象
model.load_model(abs_path("weights/parking-yolov8n.pt", path_type="current")) # 加載預訓練的YOLOv8模型
(3)創建主窗口
????????我們定義了MainWindow類,它是基于PySide6的QtWidgets中的QMainWindow類。這個窗口將用于顯示檢測后的圖像。我們還定義了keyPressEvent方法,讓用戶可以通過按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)主程序流程
????????在主函數的實現中,我們首先創建一個Qt應用程序實例和主窗口實例。然后,我們從指定路徑加載圖像,并進行大小調整和預處理。接著,模型對預處理后的圖像進行預測,并計算推理時間。
if __name__ == '__main__': # 如果當前模塊是主模塊app = QtWidgets.QApplication(sys.argv) # 創建QApplication對象window = MainWindow() # 創建MainWindow對象img_path = abs_path("test_media/ParkingSpacesv2_SIXU_A_00320.jpg") # 定義圖像文件的路徑image = cv_imread(img_path) # 使用cv_imread函數讀取圖像image = cv2.resize(image, (640, 640)) # 將圖像大小調整為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: # 遍歷檢測信息# 獲取類別名稱、邊界框、置信度和類別IDname, bbox, conf, cls_id = info['class_name'], info['bbox'], info['score'], info['class_id']label = '%s %.0f%%' % (name, conf * 100) # 創建標簽,包含類別名稱和置信度# 畫出檢測到的目標物image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id]) # 在圖像上繪制邊界框和標簽window.dispImage(window.label, image) # 在窗口的label上顯示圖像# 顯示窗口window.show()# 進入 Qt 應用程序的主循環sys.exit(app.exec())
????????在最后一部分,我們檢查預測結果,并對每個檢測到的對象繪制邊界框和標簽。這些檢測框和標簽將直接在主窗口中的標簽上顯示。
5. 停車位檢測系統實現
????????在構建我們的交互式停車位檢測與識別系統時,我們追求的是一個整合了高性能目標檢測算法與用戶交互界面的解決方案。該系統旨在提供一種直觀的方式,以實時監控和識別視頻流中的多個目標,適用于安全監控、自動化監測以及互動媒體等場景。為了實現這一目標,系統設計采取了模塊化的思路,將界面、媒體處理和深度學習模型緊密集成,以確保高效和靈活的操作。
5.1 系統設計思路
????????在我們的系統設計中,我們的設計理念是構建一個高效、直觀且用戶友好的界面,使用戶能夠無縫地與系統交互。整個系統被設計為一個緊密集成的框架,其中每個組件都旨在提升整體性能和用戶體驗。
(1)架構設計
????????在系統的架構設計中,我們采用了分層的方法來確保各個組件的獨立性和模塊化。這樣的設計不僅有助于代碼的維護和更新,而且使得系統各部分能夠高效協同工作。
- 處理層(Processing Layer):處理層是整個系統的核心,它使用由YOLOv8Detector類實現的高精度預訓練模型來執行圖像中停車位的實時檢測和識別任務。這一層的算法優化確保了檢測過程的準確性和速度,以滿足實時應用的需求。
- 界面層(UI Layer):界面層則是用戶與系統互動的前端,我們通過精心設計的UI元素,如按鈕、標簽和圖像顯示框等,為用戶提供了直觀的操作方式。這個層面上,界面的布局和設計考慮了易用性和美觀性,確保用戶能夠快速理解并使用系統,無需深入了解背后的技術細節。
- 控制層(Control Layer):控制層充當用戶指令和系統響應之間的橋梁,它負責處理用戶的輸入,如按鈕點擊和鍵盤操作,并通過槽函數調用適當的處理邏輯。此外,控制層還管理著界面與處理層之間的數據流動,使用事件驅動的編程模型來響應用戶交互,并將處理結果實時反饋到界面層,實現了一個響應迅速的用戶體驗。
????????通過這種三層架構設計,我們的停車位檢測系統將高效的機器視覺技術與易于操作的用戶界面相結合,旨在為用戶提供一個無縫的交互體驗。用戶可以直觀地觀察檢測結果,并可以通過簡單的操作來控制系統,如開始和停止檢測,查看歷史檢測結果等。在實際應用中,這樣的設計思路能夠大幅度提高用戶的工作效率,同時也降低了操作錯誤的可能性,使得停車位檢測變得更加便捷和準確。
(2)系統流程
????????在本博客中,我們將詳細介紹一個高度交互式的停車位檢測與識別系統的設計流程。該系統以其直觀的操作界面和強大的后端計算能力,為用戶提供了一個無縫的使用體驗。我們的目標是讓用戶能夠輕松操控高級的計算機視覺技術,并能夠實時接收和分析來自不同輸入源的數據。
-
當用戶進入應用程序后,首先面臨的是選擇輸入源的界面。我們的系統靈活設計,支持多種輸入源,包括實時攝像頭捕捉、視頻流或者靜態圖像文件,以適應不同用戶的需求。用戶可以通過簡潔明了的界面輕松選擇或切換輸入源,系統后臺將自動處理與之相關的配置和加載過程,確保輸入數據的無縫接入和處理。
-
選擇好輸入源后,系統進入連續幀處理流程,這是整個應用程序的核心部分。在預處理階段,系統會對輸入的每一幀圖像進行諸如縮放、色彩空間轉換等一系列操作,確保圖像數據滿足YOLOv8模型的輸入標準。接下來,在檢測與識別階段,經過預處理的圖像將被送入精確訓練的YOLOv8模型中,模型負責識別圖像中的空閑和占用的停車位,并給出具體的檢測結果。
-
為了讓用戶可以實時地觀察到檢測的結果,我們設計了界面更新機制。隨著檢測數據的生成,系統界面將即時反映出新的檢測框和識別信息,并且通過表格或圖表的形式動態展示統計數據,讓用戶能夠直觀地理解當前停車場的狀態。此外,系統還提供了豐富的交互操作,用戶可以通過按鈕進行如保存結果、訪問系統信息等操作,通過下拉菜單進行檢測結果的篩選和分析,這大大增強了用戶使用系統的靈活性和深度。
-
最后,系統還考慮到了用戶對于媒體播放控制的需求。無論是攝像頭實時圖像的捕捉、視頻文件的播放還是圖像文件的分析,用戶都可以輕松控制媒體的播放狀態,如開始、暫停或停止,這些功能的集成保證了用戶對于整個檢測過程的完全掌控。
????????總之,本系統的設計思路圍繞著用戶體驗和操作效率展開,從直觀的輸入選擇到實時的檢測展示,再到靈活的用戶交互,每一環節都經過精心設計,以確保用戶在使用停車位檢測系統時能夠享受到順暢、高效且功能強大的服務。
5.2 登錄與賬戶管理
????????在今天這個信息化快速發展的時代,為了提供一個安全、個性化的用戶體驗,我們的停車位檢測系統引入了全面的登錄與賬戶管理功能。利用PySide6強大的GUI能力和SQLite的數據庫支持,我們構建了一個用戶友好的登錄界面,不僅僅是為了驗證身份,更是為了提供一個私人定制的操作環境。
????????當用戶第一次使用系統時,會被引導完成賬戶的注冊過程,創建一個屬于自己的賬戶。用戶信息將被安全地存儲在SQLite數據庫中,這其中包括了用戶名、加密后的密碼和個性化的頭像等。用戶可以隨時更新自己的個人資料,包括修改密碼和更換頭像,確保賬戶信息的及時更新和個人隱私的保護。如果用戶忘記了密碼,系統還提供了密碼重置的功能,保障了用戶能夠順利地恢復訪問權限。
????????進入系統后,用戶將來到主界面,這里是停車位檢測任務的操作中心。用戶可以通過這個界面訪問和管理自己的檢測記錄,包括歷史檢測結果的查詢和管理。每個用戶的檢測結果都是私密的,并且與賬戶綁定,保證了數據的個人化和安全性。
????????系統不僅支持個人用戶的操作,還為管理者提供了賬戶注銷和管理的功能。管理者可以對用戶賬戶進行管理,包括注銷不活躍的賬戶,確保系統的高效運行和資源的合理分配。
????????通過這些豐富的賬戶管理功能,我們的停車位檢測系統為用戶提供了一個既安全又便捷的使用環境。無論是初次注冊,還是日常的賬戶維護,用戶都能在系統中得到一個流暢和愉快的體驗。同時,這種設計還為用戶提供了個性化的操作空間,使他們能夠在一個安全的環境中管理和回顧自己的檢測數據,從而更好地利用停車位檢測系統,增強了用戶對系統的粘性和滿意度。
下載鏈接
????若您想獲得博文中涉及的實現完整全部資源文件(包括測試圖片、視頻,py, UI文件,訓練數據集、訓練代碼、界面代碼等),這里已打包上傳至博主的面包多平臺,見可參考博客與視頻,已將所有涉及的文件同時打包到里面,點擊即可運行,完整文件截圖如下:
完整資源中包含數據集及訓練代碼,環境配置與界面中文字、圖片、logo等的修改方法請見視頻,項目完整文件下載請見演示與介紹視頻的簡介處給出:???
演示與介紹視頻:https://www.bilibili.com/video/BV1hi421d77E/
????在文件夾下的資源顯示如下,下面的鏈接中也給出了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等模型。系統以模塊化的方式設計,充分采用了合理的架構設計,帶來良好的可維護性和可擴展性。其用戶界面友好,能夠提供實時的停車位檢測和識別結果展示,同時支持用戶賬戶管理,以便于保存和管理檢測結果和設置。
????????該系統支持攝像頭、視頻、圖像和批量文件等多種輸入源,能夠滿足用戶在不同場景下的需求。在后面可以添加更多預訓練模型,增加檢測和識別的種類;優化用戶界面,增強個性化設置;并積極聆聽用戶反饋,以期不斷改進系統,以更好地滿足用戶的需求。
結束語
????????由于博主能力有限,博文中提及的方法即使經過試驗,也難免會有疏漏之處。希望您能熱心指出其中的錯誤,以便下次修改時能以一個更完美更嚴謹的樣子,呈現在大家面前。同時如果有更好的實現方法也請您不吝賜教。
Redmon J, Divvala S, Girshick R, et al. You only look once: Unified, real-time object detection[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 779-788. ??
Redmon J, Farhadi A. YOLO9000: better, faster, stronger[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 7263-7271. ??
Bochkovskiy A, Wang C Y, Liao H Y M. Yolov4: Optimal speed and accuracy of object detection[J]. arXiv preprint arXiv:2004.10934, 2020. ??
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. ??
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. ??
Terven J, Cordova-Esparza D. A comprehensive review of YOLO: From YOLOv1 to YOLOv8 and beyond[J]. arXiv preprint arXiv:2304.00501, 2023. ??