摘要:開發高效的夜視行人檢測系統對于提升夜間安全和監控效能至關重要。本篇博客詳盡介紹了如何利用深度學習技術搭建一個夜視行人檢測系統,并提供了完整的實現代碼。本系統采用了先進的YOLOv8算法,并與YOLOv7、YOLOv6、YOLOv5進行了性能比較,展示了不同模型間的mAP、F1 Score等關鍵性能指標。文章深度解析了YOLOv8算法的內部機制,提供了相應的Python代碼和訓練數據集,以及一個基于PySide6的直觀UI界面。
該系統能夠在夜視儀條件下精確識別和分類圖像中的行人,支持從靜態圖片、圖片文件夾、視頻以及實時攝像頭輸入進行檢測。系統功能包括熱力圖分析、目標標記框、類別統計、可調節的置信度和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)系列算法,從YOLOv5到最新的YOLOv8,不斷地在檢測速度和準確性上取得突破。這些算法的改進,包括但不限于網絡架構的優化、損失函數的調整以及訓練策略的創新,極大地提高了在低光照條件下的行人檢測性能。同時,隨著數據集的不斷更新和擴充,模型的訓練和驗證變得更加全面,能夠更好地適應不同的夜間環境。
????????隨著YOLO(You Only Look Once)系列目標檢測算法的出現和發展,已經提出了更高效、更精準的目標檢測工具。從最早的YOLO1,到YOLO90002,再到YOLOv43,YOLOv5等,這一系列的發展都在推動著目標檢測技術的進步。在去年美團發布了YOLOv64,然后緊接著YOLOv75,到現在的YOLOv86,這個最新版本在許多方面都進行了優化與改進,如使用了更復雜的網絡架構,更精細的預測機制,以及加入了對小目標的更好處理。
????????作為YOLO系列的最新作品,YOLOv8在性能上有了進一步的提升。研究表明,YOLOv8在保持高檢測速度的同時,通過改進的損失函數和更深的網絡結構,提高了對夜間行人的檢測準確性。特別是在處理遠距離或部分遮擋行人時,表現出了更好的魯棒性。為了進一步提高夜視行人檢測的性能,研究者們探索了將紅外圖像與可見光圖像結合的多模態方法。通過融合不同模態的數據,可以更全面地捕捉行人的特征,提高檢測的魯棒性和準確性。
????????隨著研究的深入,一些針對夜視行人檢測的專用數據集被構建,如KAIST Multispectral Pedestrian Dataset等,這些數據集促進了算法的開發和評估。同時,研究者也提出了多種評估指標來準確衡量檢測算法在夜間條件下的性能。在實際應用中,尤其是在移動端或嵌入式系統中,資源限制和實時性要求使得夜視行人檢測面臨額外挑戰。因此,研究者致力于優化算法,減少計算資源消耗,同時保證檢測速度和準確率。
????????一些研究嘗試將深度學習方法與傳統的機器學習技術結合起來,以提高夜視環境下行人檢測的準確率。例如,通過先用深度學習模型進行粗略檢測,然后用傳統算法進行細節優化,這種混合方法在提高檢測精度的同時,還能保持較快的處理速度。
????????本博客所做的工作是基于YOLOv8和YOLOv5算法構建一個夜視行人目標檢測系統,展示系統的界面效果,詳細闡述其算法原理,提供代碼實現,以及分享該系統的實現過程。希望本博客的分享能給予讀者一定的啟示,推動更多的相關研究。本文的主要貢獻如下:
-
采用最先進的YOLOv8算法:本文首次將YOLOv8算法應用于夜視行人檢測,與之前的研究相比,YOLOv8在檢測速度和準確性上都有顯著提升。通過詳細介紹YOLOv8算法的應用流程和優化策略,本文不僅展示了如何有效地利用最新的深度學習模型進行高效的行人檢測,還通過與YOLOv7、YOLOv6、YOLOv5等算法的對比分析,直觀展示了YOLOv8在夜視行人檢測領域的優勢。
-
實現用戶友好的系統界面:通過使用Python的PySide6庫,本文開發了一個既美觀又易于操作的夜視行人檢測系統界面。這一創新不僅使得夜視行人檢測變得更加直觀和便捷,而且為YOLOv8算法及其他相關技術的推廣和應用提供了有力支持。
-
設計登錄管理功能,提升系統安全性:本文設計的登錄管理功能,不僅增強了系統的安全性,也為實現更加個性化的用戶體驗奠定了基礎。這一功能的添加,使得系統能夠在保障用戶數據安全的同時,為未來引入更多高級功能提供可能。
-
深入研究YOLOv8模型性能:本文對YOLOv8模型進行了全面深入的性能評估,包括精確度、召回率等關鍵指標的測試,以及在不同環境和條件下的性能分析。這些研究成果不僅豐富了行人檢測領域的理論基礎,也為算法的進一步優化提供了重要參考。
-
提供完整的數據集和代碼資源包:為了促進YOLOv8在夜視行人檢測領域的應用和研究,本文提供了一套完整的數據集和代碼資源包。這些資源的公開,使得讀者可以輕松復現文中的實驗結果,并在此基礎上開展更深入的研究或者進行定制化的系統開發。
1. 數據集介紹
????????在本博客章節中,我們將深入探討構成夜視行人檢測系統的關鍵組成部分之一:數據集。在任何機器學習項目中,數據集都是至關重要的,因為它直接決定了模型訓練的質量和最終系統的性能。為此,我們精心準備了一個專為夜間行人檢測量身打造的數據集,以確保在實際應用中能夠達到最佳的檢測效果。我們的數據集共包括5725張圖像,這些圖像細致劃分為4032張訓練圖像、1104張驗證圖像以及589張測試圖像。這種劃分策略旨在為模型訓練提供充足的數據,同時保留獨立的樣本集來評估模型對于新數據的適應能力和泛化性。通過這種精心設計的分割,我們確保了模型能夠在廣泛的數據上學習,并能夠在未知數據上進行有效的性能評估。
????????在數據預處理階段,我們采取了若干關鍵步驟來提升模型的訓練效率和檢測精度。首先,所有圖像都進行了自動方向校正,并移除了EXIF信息中的方向屬性,這一步驟是為了消除由于不同攝影設備和拍攝條件引入的差異,從而讓模型更加聚焦于行人檢測任務本身。其次,考慮到不同圖像的分辨率可能會影響模型的學習效果,我們將所有圖像統一調整到810x1080像素的分辨率,采用拉伸方式以保持輸入數據的一致性,盡管這可能引入一定的形狀失真,但它對于保持算法處理速度和簡化網絡結構至關重要。
????????此外,我們的數據集展示了行人在夜間環境中的典型分布特征。從行人位置的分布圖中可以看出,行人通常位于圖像的中心區域,這反映了現實世界中行人通常在道路中間行走的情況。而行人目標的寬高比分布圖進一步告訴我們大多數行人目標呈現出較窄的寬度和較高的高度,這與人類的體型特征相符。這些分布特性不僅幫助模型學習到行人在圖像中的位置和尺寸,同時也指導我們在后續的數據增強和模型訓練中,更好地模擬和適應不同的檢測場景。博主使用的類別代碼如下:
Chinese_name = {'person': "行人"}
????????總而言之,我們的數據集不僅在數量上充足,而且在質量上精良,為夜視行人檢測系統提供了堅實的基礎。通過對這些數據進行深入的分析和合理的預處理,我們為模型的訓練奠定了基礎,并期待它在實際環境中表現出色。
2. 系統界面效果
????????系統以PySide6作為GUI庫,提供了一套直觀且友好的用戶界面。下面,我將詳細介紹各個主要界面的功能和設計。
(1)系統提供了基于SQLite的注冊登錄管理功能。用戶在首次使用時需要通過注冊界面進行注冊,輸入用戶名和密碼后,系統會將這些信息存儲在SQLite數據庫中。注冊成功后,用戶可以通過登錄界面輸入用戶名和密碼進行登錄。
(2)在主界面上,系統提供了支持圖片、視頻、實時攝像頭和批量文件輸入的功能。用戶可以通過點擊相應的按鈕,選擇要進行夜視行人檢測的圖片或視頻,或者啟動攝像頭進行實時檢測。在進行夜視行人目標檢測時,系統會實時顯示檢測結果,并將檢測記錄存儲在數據庫中。
(3)此外,系統還提供了一鍵更換YOLOv8或YOLOv5模型的功能。用戶可以通過點擊界面上的"更換模型"按鈕,選擇不同的YOLOv8模型進行檢測。與此同時,系統附帶的數據集也可以用于重新訓練模型,以滿足用戶在不同場景下的檢測需求。
(4)為了提供更個性化的使用體驗,這里系統支持界面修改,用戶可以自定義圖標、文字等界面元素。例如,用戶可以根據自己的喜好,選擇不同風格的圖標,也可以修改界面的文字描述。
3. YOLOv8算法原理
????????YOLOv8是目前YOLO系列中最新的一階段目標檢測算法,相較于其他主流目標檢測算法,速度更快,精度更高,性能更好,在眾多任務上取得了SOTA的成績。YOLOv8目前一共有5個版本,包括:YOLOv8n、YOLOv8s、YOLOv8m、YOLOv8l、YOLOv8x,考慮到計算速度、實時性、精度,本文選擇了YOLOv8s作為Baseline,在此基礎上改進和創新滿足小目標檢測的任務。相較于YOLOv5,YOLOv8主要有兩大改進,首先檢測頭部分換成了當前主流的解耦頭,同時從Anchor-Based變為Anchor-Free。其次拋棄了以往IOU匹配或者單邊比例的匹配方式,而是使用了Task-AlignedAssigner正負樣本匹配方式,并引入了DFLloss。在數據增強部分借鑒了YOLOX的思想,在最后10個epoch關閉Mosiac數據增強,有效提升精度。
????????YOLOv8在目標檢測技術領域的主要特點和改進主要集中在以下幾個方面:
- 骨干網絡和Neck部分跨階段局部網絡(Cross Stage Partial Network, CSP)模塊的預處理從三次卷積換成了兩次卷積,借鑒了YOLOv7 ELAN模塊多堆疊的設計思想,將YOLOv5的C3結構換成了梯度流更豐富的C2f結構,并對不同尺度模型調整了不同的通道數,使網絡能夠學習到更多的特征,并且具有更強的魯棒性。CSP模塊的預處理從三次卷積換成了兩次卷積,并且借鑒了YOLOv7的多堆疊結構。具體的實現方式是第一次卷積的通道數擴充為原來的兩倍,然后將卷積結果在通道上對半分割,這樣可以減少一次卷積的次數,加快網絡的速度。7
- 檢測頭部分,YOLOv8采用無錨分體式檢測頭,與基于錨框的方法相比,有助于提高準確性和更高效的檢測過程。Head部分較YOLOv5而言有兩大改進。首先,換成了目前主流的解耦頭結構,將分類和檢測頭分離,用于緩解分類和定位任務之間存在的沖突;其次,參考YOLOX,從Anchor-Based換成了Anchor Free,面對長寬不規則的目標比較有優勢。7
- 損失函數計算部分,YOLOv8的Loss計算包括兩個部分:分類分支和回歸分支。分類分支依然采用BCE Loss,回歸分支需要和分布式聚焦損失函數(Distribution Focal Loss, DFL)中提出的積分形式表示法綁定,因此使用了DFL,同時還使用了(Complete Inter section over Union, CIoU)Loss。7
4. 代碼簡介
????????在本節中,我們將詳細介紹如何使用YOLOv8進行目標檢測的代碼實現。代碼主要分為兩部分:模型預測和模型訓練。
4.1 模型預測
????????在模型預測部分,首先導入導入OpenCV庫:OpenCV(Open Source Computer Vision Library)是一個廣泛使用的開源計算機視覺和機器學習軟件庫。它提供了大量的視覺處理函數,非常適合用于讀取和處理圖像。在本場景中,OpenCV用于加載和預處理待檢測的圖像文件。接下來的代碼是YOLO模型的加載和應用,首先從自定義的YOLOv8Model模塊中導入YOLOv8Detector類,這個類封裝了YOLOv8模型的加載和目標檢測功能。
import cv2
from QtFusion.path import abs_path
from ultralytics import YOLO
from YOLOv8Model import YOLOv8Detector
????????加載預訓練的YOLO模型:代碼中創建了YOLOv8Detector的實例,并使用預訓練的模型權重進行加載。這些權重文件通常是在大量圖像上訓練得到的,可以有效地提升模型在特定任務(如夜視行人檢測)上的表現。
model = YOLOv8Detector()
model.load_model(abs_path("weights/night-yolov8n.pt", path_type="current"))
????????讀取圖像文件:使用OpenCV的imread函數讀取待檢測的圖像文件。該函數將圖像作為一個數組加載進內存,便于后續的處理和分析。
im2 = cv2.imread("test_media/NightVision_SIXU_A_00484.jpg")
????????使用模型進行預測:最后,代碼調用YOLOv8Detector實例的predict方法對加載的圖像進行目標檢測,此方法返回檢測結果和圖像。
pred, superimposed_img = model.predict(pre_img)
4.2 模型訓練
????????在模型訓練部分,首先導入YOLO模型,并加載了預訓練的YOLOv8模型。
from ultralytics import YOLO
model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect')
????????接著開始訓練模型。其中指定了訓練數據的配置文件路徑,使用CPU進行訓練,使用2個工作進程加載數據,輸入圖像的大小為640x640,訓練100個epoch,每個批次的大小為8。
results = model.train( data=data_path, device='cpu', workers=workers, imgsz=640, epochs=100, batch=batch, name='train_v8_' + data_name )
????????在深度學習中,我們通常通過損失函數下降的曲線來觀察模型訓練的情況。在訓練結束后,我們也可以在logs目錄下找到生成對若干訓練過程統計圖。下圖為博主訓練夜視行人檢測過程中訓練情況截圖,以及損失函數曲線圖,展示了模型在訓練和驗證過程中的性能指標變化。
????????首先,訓練損失(train/box_loss, train/cls_loss, train/dfI_loss)隨著迭代次數增加而持續下降,這表明模型在學習過程中不斷優化,對數據集的擬合越來越好。具體來說,邊界框損失(box_loss)從初始的較高值迅速下降,然后逐漸趨于平穩,這說明模型在定位行人目標方面的性能逐步提升。分類損失(cls_loss)和方向損失(dfI_loss)也顯示出類似的趨勢,這兩者的下降意味著模型在辨識目標類別和檢測目標的方向上同樣取得了進步。然而,驗證損失(val/box_loss, val/cls_loss, val/dfI_loss)在經過初期下降后,波動變得較為劇烈,特別是在box_loss上。這種波動可能意味著模型在驗證集上可能存在過擬合的趨勢,或者驗證集中的某些圖像對模型而言難以擬合。而驗證損失的波動也說明模型在不同的驗證樣本上表現出了不同程度的適應性。
????????在精度和召回率方面,我們看到訓練精度(metrics/precision)和召回率(metrics/recall)隨著訓練過程呈現出上升趨勢,但召回率的波動較精度更為顯著。這表明模型在正確分類正樣本(即行人)方面逐漸變得更加精確,但在找回所有正樣本方面則相對不穩定,可能是由于數據集中行人姿態多變、遮擋情況復雜等因素造成的。
????????至于模型的平均精度(mAP),mAP@0.5和mAP@0.5-0.95均隨著訓練的進行表現出增長趨勢,這兩個指標通常被用來衡量模型對于目標檢測任務的整體表現。mAP@0.5較高的增長表明模型在較為寬松的IoU閾值下表現良好,而mAP@0.5-0.95的增長則表示模型在更為嚴格的IoU閾值下同樣能夠保持較好的性能。
????????在評估目標檢測模型的性能時,通常會關注召回率(Recall)和精確度(Precision)這兩個核心指標。召回率和精確度,通常縮寫為R和P,都是用來從單一維度評價模型性能的指標,它們的值范圍在0到1之間,接近1意味著模型性能更佳,而接近0則表示性能較差。
???????? 首先,我們注意到曲線的起始點是(0,1),意味著在最佳閾值設置下,模型能夠以幾乎完美的精確度檢測到所有的正樣本,即沒有產生任何誤檢。隨著召回率的增加,精確度略有下降,但整體保持在非常高的水平。這表明模型在大多數情況下能夠很好地區分行人和非行人目標,只有少量的誤檢或漏檢發生。
???????? PR曲線下的面積(AUC)是評估模型質量的一個標準指標,曲線下的面積越大,模型的性能越好。在這里,我們看到PR曲線覆蓋了接近整個圖表區域的面積,這指示著模型具有優異的分類性能。結合圖中給出的數值結果,即所有類別的平均精確度(mAP@0.5)為0.907,我們可以確認這是一個高精度的模型。mAP@0.5是指在0.5的IoU(Intersection over Union)閾值下的平均精確度,0.5是一個常用的IoU閾值,通常意味著模型對目標位置的預測非常精確。
???????? 進一步觀察曲線在高召回率區域的表現,精確度始終保持在0.8以上,這是非常難得的,因為通常情況下,當模型試圖檢測到更多的正樣本時(召回率高時),會以犧牲一些精確度為代價。然而,在此模型中,即使在高召回率時,精確度的下降也非常有限,這表明模型對于數據集中的行人檢測具有很好的穩定性和可靠性。
???????? 綜合以上分析,我們的模型在夜視行人檢測任務上表現出色,無論是在定位準確性還是在保持低誤檢率方面都有著優異的表現。這樣的性能表明模型不僅適用于實驗室環境,更有很強的實際應用潛力。未來的工作可以集中在進一步提高模型的召回率,尤其是在更加復雜或低光照條件下,同時保持或提升現有的精確度水平。此外,繼續探索各種數據增強和正則化技術可能有助于提升模型在更廣泛條件下的泛化能力。通過不斷的迭代和優化,我們期待模型能夠在多樣化的環境中持續提供準確可靠的行人檢測功能。
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.899 | 0.910 | 0.885 | 0.907 |
F1-Score | 0.86 | 0.86 | 0.86 | 0.87 |
(3)實驗結果分析:
??????? 在深度學習領域,持續的算法迭代和更新是提升模型性能的關鍵途徑。我們通過在相同的數據集上實施一系列實驗,旨在比較和評估不同版本的YOLO模型——包括YOLOv5nu、YOLOv6n、YOLOv7-tiny以及YOLOv8n——在夜視行人檢測任務上的性能。實驗的設計和目的是為了明確各版本模型在準確性和檢測效率上的差異,以便為實際應用提供更具指導性的見解。
??????? 我們可以看出,YOLOv6n在平均精確度(mAP)上取得了0.910的成績,這是四種算法中最高的,顯示了其在目標檢測任務上的優越性能。mAP是評價目標檢測算法性能的關鍵指標,它考慮了檢測精確度和召回率,在不同的置信度閾值下綜合評估模型性能。YOLOv6n能在這個指標上領先,表明它能夠平衡檢測的準確性和完整性,即在盡可能少錯過目標的同時保持較低的誤檢率。YOLOv5nu雖然在mAP上略低于YOLOv6n,達到了0.899,但它與YOLOv6n在F1-Score上持平,都是0.86。F1-Score是精確度和召回率的調和平均,它在模型表現均衡時達到高值。這說明在精確度與召回率之間,YOLOv5nu能夠實現較好的平衡,這對于實際應用來說非常重要。
??????? YOLOv7-tiny作為一個更輕量化的模型,其mAP達到了0.885,略低于YOLOv5nu和YOLOv6n,但與此同時它在F1-Score上與這兩者持平。這可能意味著在面對一個更加緊湊的模型時,YOLOv7-tiny能夠保持一個不錯的性能水平,這在資源受限的應用場景中是一個顯著的優點。
??????? 至于YOLOv8n,其mAP為0.907,僅次于YOLOv6n,而在F1-Score上則以0.87領先于其他三種算法。這表明YOLOv8n在保持高召回率的同時,也提高了精確度,達到了最佳的性能平衡。F1-Score的領先表明在實際應用中,它可能會帶來最佳的綜合檢測效果。
??????? 總體來看,每一版本的YOLO算法都在不同程度上提高了目標檢測的性能。從YOLOv5nu到YOLOv8n,我們可以看到一步步的進步,尤其是在精確度和召回率的綜合考量上。雖然每個算法版本之間的性能提升可能看起來不是非常巨大,但在高標準的目標檢測任務中,這些小的進步往往對實際應用有著決定性的影響。此外,每個版本的算法都有其獨特的設計優點,根據不同的應用場景和資源限制,選擇最合適的算法變得尤為重要。通過這樣的對比實驗,我們能夠更深入地理解每個算法版本的性能特點,為實際應用中的算法選擇提供數據支持。
4.4 代碼實現
????????在這一節中,我們將詳細介紹如何使用YOLOv8實現攝像頭畫面中夜視行人檢測的代碼實現。這個實現主要包括創建主窗口、處理每一幀圖像、加載模型、開始處理媒體流等步驟。
????????在實時夜視行人檢測系統中,結合YOLOv8模型和一系列開源庫,如OpenCV、QtFusion和PySide6等,來實現主窗口的展示、攝像頭幀的處理以及夜視行人的檢測和標注等功能。
(1)引入必要的庫
????????首先,需要引入一些必要的庫,包括圖像處理庫OpenCV、圖形界面庫QtFusion和PySide6,以及物體檢測模型庫YOLOv8Model等。
import sys # 導入sys模塊,用于訪問與Python解釋器相關的變量和函數
import time # 導入time模塊,用于獲取當前時間import cv2 # 導入OpenCV庫,用于圖像處理
from QtFusion.widgets import QMainWindow # 從QtFusion庫導入FBaseWindow類,用于創建主窗口
from QtFusion.handlers import MediaHandler # 從QtFusion庫導入MediaHandler類,用于處理媒體流
from QtFusion.utils import drawRectBox, get_cls_color # 從QtFusion庫導入drawRectBox函數,用于在圖像上繪制矩形框
from PySide6 import QtWidgets, QtCore # 導入PySide6庫的QtWidgets和QtCore模塊,用于創建GUI
from QtFusion.path import abs_path
from QtFusion.config import QF_Config
from YOLOv8Model import YOLOv8Detector # 從YOLOv8Model模塊導入YOLOv8Detector類,用于物體檢測QF_Config.set_verbose(False)
(2)設置主窗口
????????在設置主窗口的過程中,定義了一個名為MainWindow的類。在MainWindow類中,設置了窗口的大小,并創建了一個用于顯示圖像的標簽。此外,我們還設置了一個按鍵事件,使得用戶可以通過按Q鍵來關閉窗口。
class MainWindow(QMainWindow): # 定義MainWindow類,繼承自FBaseWindow類def __init__(self): # 定義構造函數super().__init__() # 調用父類的構造函數self.resize(850, 500) # 設置窗口的大小self.label = QtWidgets.QLabel(self) # 創建一個QLabel對象,用于顯示圖像self.label.setGeometry(0, 0, 850, 500) # 設置QLabel對象的幾何形狀def keyPressEvent(self, event): # 定義keyPressEvent函數,用于處理鍵盤事件if event.key() == QtCore.Qt.Key.Key_Q: # 如果按下的鍵是Q鍵self.close() # 關閉窗口
(3)圖像幀處理與夜視行人目標檢測
????????在進行圖像幀處理和夜視行人檢測的過程中,定義了一個名為frame_process的函數。首先,將圖像的大小調整為850x500,然后使用YOLOv8模型進行預處理。使用該模型對圖像進行預測,將預測結果后處理,并將檢測到的夜視行人目標用對應類別顏色的矩形框在圖像中標注出來。
def frame_process(image): # 定義frame_process函數,用于處理每一幀圖像image = cv2.resize(image, (850, 500)) # 調整圖像的大小pre_img = model.preprocess(image) # 對圖像進行預處理t1 = time.time() # 獲取當前時間pred, superimposed_img = 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控件上顯示圖像
(4)初始化檢測模型和設備
????????在主函數部分,我們首先實例化YOLOv8Detector類,并加載預先訓練好的模型權重。根據模型預設的類別標簽獲取了每個類別對應的顏色,這些顏色將在后續的檢測結果可視化中使用。創建一個MainWindow對象,以便在屏幕上顯示圖像。再創建了一個MediaHandler對象,用于從攝像頭設備中讀取視頻流并處理每一幀圖像。
cls_name = ["行人"] # 定義類名列表model = YOLOv8Detector() # 創建YOLOv8Detector對象
model.load_model(abs_path("weights/night-yolov8n.pt", path_type="current")) # 加載預訓練的YOLOv8模型
colors = get_cls_color(model.names) # 獲取類別顏色app = QtWidgets.QApplication(sys.argv) # 創建QApplication對象
window = MainWindow() # 創建MainWindow對象videoHandler = MediaHandler(fps=30) # 創建MediaHandler對象,設置幀率為30
videoHandler.frameReady.connect(frame_process) # 當有新的幀準備好時,調用frame_process函數
videoHandler.setDevice(device=0) # 設置設備為0,即默認的攝像頭
videoHandler.startMedia() # 開始處理媒體流# 顯示窗口
window.show()
# 進入 Qt 應用程序的主循環
sys.exit(app.exec())
????????在此,"night-yolov8n.pt"是經過大量夜視行人目標圖像訓練得到的模型權重文件,而cls_name則包含了模型可以識別的所有夜視行人類別的名稱。這就是實現實時夜視行人檢測系統的完整代碼,整個過程包括了數據預處理、YOLOv8模型預測、結果后處理和可視化等步驟,結構清晰,邏輯簡潔。通過這樣的方式,可以實現對攝像頭捕獲的畫面進行實時的夜視行人目標識別和標注。
5. 夜視行人檢測系統實現
????????在實現一款實時夜視行人目標檢測與識別系統時,采用面向對象的設計思路,依賴Python語言和多種開源庫如Pyside6、QtFusion、Pytorch等。其中,重要的MainWindow類是系統的主體,負責提供用戶界面來控制輸入源、進行夜視行人目標檢測與識別,并展示檢測結果。以下將詳細介紹其設計思路、架構設計以及整個流程。
5.1 系統設計思路
????????我們的系統設計思路旨在打造一個高效、直觀且用戶友好的應用程序。整個系統是圍繞著MainWindow類構建的,這個類不僅作為應用程序的核心,同時也是用戶交互、媒體處理以及模型集成的集合點。
架構設計:
????????在MainWindow類的架構設計中,采用了處理層、界面層、控制層的設計模式。在整個設計過程中,我們遵循了模塊化和低耦合的原則,這意味著每個類和模塊都被設計為相對獨立的組件。這種設計不僅有利于代碼的維護和擴展,還使得未來在引入新的算法或進行功能更新時更加靈活。此外,系統的這種架構設計還為多線程處理提供了可能,從而可以在不影響用戶界面響應性的情況下進行復雜的后臺計算。
- 處理層(Processing Layer):在這一層,我們重點關注的是檢測的準確性和速度。YOLOv8Detector類充當了模型執行的中樞,它集成了預訓練的YOLOv8模型,負責高效地處理圖像數據,識別并定位圖像中的行人。為了提高系統的響應速度和處理能力,我們在設計時注重了算法的優化,確保了系統即使在處理大量數據時也能保持穩定。
- 界面層(UI Layer):用戶界面的設計采用直觀的布局,使用戶能夠輕松地訪問所有功能。通過Ui_MainWindow類創建的圖形界面,不僅美觀現代,而且用戶交互性強。界面中嵌入了實時顯示檢測結果的視頻或圖像流組件,用戶可以通過簡單的按鈕點擊來啟動或停止檢測過程,查看歷史檢測記錄,以及訪問系統設置等。
- 控制層(Control Layer):MainWindow類在這里扮演著指揮官的角色,它協調用戶界面和處理層的交互。通過槽函數的實現,當用戶在UI層進行操作時(如點擊按鈕),MainWindow類能夠響應這些操作,并指揮YOLOv8Detector類開始處理任務。此外,MainWindow類還負責處理來自YOLOv8Detector類的信號,比如檢測結果的更新,將這些信息反饋到UI層,讓用戶得到即時的檢測反饋。
????????總之,我們的交互式夜視行人檢測系統是一個綜合了最新深度學習技術、具有高度模塊化設計、并且注重用戶體驗的系統。它不僅能夠提供準確的行人檢測功能,同時也提供了易于使用的界面和強大的后臺支持,滿足了專業性和便捷性的雙重需求。
系統流程:
????????在本博客中,我們將詳細介紹為夜視行人檢測系統設計的軟件流程,該流程以用戶友好性和高效性能為核心目標。該系統通過MainWindow類的實例啟動,這是用戶與系統交互的入口。該實例不僅加載和初始化應用程序的界面,還設置了應用程序運行所需的各種參數,確保用戶能夠無障礙地進行操作。
- 用戶進入應用程序后,將面對一個清晰直觀的操作界面,可選擇實時視頻流、視頻文件或圖像作為輸入源。這種靈活性允許用戶根據自己的需求和場景選擇最合適的輸入方式。例如,他們可以選擇實時監控攝像頭,以觀察和分析特定區域的行人動態;或者加載已有的視頻和圖片,進行后期的檢測和分析。
- 一旦輸入源被選定,系統便激活媒體處理器,開始對輸入數據進行必要的配置和加載。這包括對實時視頻流的捕捉設置、視頻文件的逐幀讀取處理以及靜態圖像的加載。在數據準備階段,系統將確保所有媒體內容均按照模型要求的格式和標準進行優化處理。
- 隨后,系統進入連續的幀處理循環,該循環包含幾個關鍵階段。在預處理階段,每一幀圖像都會經過調整尺寸、色彩空間轉換和歸一化等一系列操作,以確保其符合YOLO模型的輸入標準。之后,在檢測與識別階段,預處理好的圖像數據會被送入訓練有素的YOLOv8模型中,進行精準的行人定位與識別。
- 在界面更新階段,檢測結果實時展現于用戶界面中,用戶可以直觀地看到每個檢測到的行人被框選出來,并伴有識別信息。同時,系統會同步更新界面上的統計數據展示,如條形圖或表格,為用戶提供直觀的數據分析。
- 此外,用戶交互操作的設計使得用戶能夠輕松地保存檢測結果,查看軟件的作者信息和版本更新,甚至通過下拉菜單篩選特定的檢測結果進行深入分析。媒體控制的功能則允許用戶自主控制視頻的播放,或啟停圖像分析,以適應不同的檢測需求。
????????這樣的系統設計思路不僅提高了操作的便捷性,也確保了軟件能夠高效執行行人檢測任務,無論是在實時監控還是事后分析方面都能滿足用戶的需求。
5.2 登錄與賬戶管理
????????在開發高性能的夜視行人檢測系統時,用戶體驗是我們考慮的重中之重。為了增強用戶體驗和提供個性化服務,我們在系統中集成了一個全功能的用戶賬戶管理系統。這一系統的構建基于PySide6——一個強大的Qt庫的Python封裝,以及SQLite數據庫——一個輕量級的數據庫解決方案,以確保我們的應用程序在處理大量用戶數據時既高效又穩定。
????????當用戶首次使用我們的系統時,他們會被引導到一個直觀的登錄界面,在這里,用戶可以進行賬戶注冊,創建屬于自己的私人賬戶。注冊過程中,我們提供了多項個性化選項,包括密碼設置和頭像上傳,以便用戶能夠個性化自己的使用體驗。為了保障用戶的數據安全,我們還實現了密碼修改功能,用戶可以隨時更新自己的登錄憑證。此外,如果用戶希望注銷賬戶,系統也提供了簡便的操作步驟來完成這一過程。
????????登錄成功后,用戶將進入主界面,這是夜視行人檢測的操作平臺。在這里,系統展示了其強大的多物體識別和檢測能力,不僅能夠實時顯示檢測框、類別和置信度等信息,還能處理來自圖片、視頻、實時攝像頭的輸入,同時支持批量文件處理。用戶的所有檢測結果和個性化設置都將存儲在其賬戶下,這樣不僅保證了數據的私密性,也使得用戶在后續的使用中能夠方便地查閱和管理自己的檢測記錄。
????????此外,我們的系統還考慮了用戶可能需要在不同設備上使用系統的情況。因此,賬戶系統支持用戶在任意設備上重新登錄并訪問他們的個人數據和配置,無論他們身處何地。這種靈活性和便利性使得我們的夜視行人檢測系統不僅是一個強大的技術工具,更是一個用戶友好的個人助手。
????????通過上述的賬戶管理設計和系統功能實現,我們的夜視行人檢測系統提供了一個安全、私密且高度個性化的用戶體驗。我們相信,隨著深度學習技術的不斷進步,結合我們對用戶需求的深刻理解,這個系統將在實時目標檢測的場景下得到廣泛的應用,并不斷滿足用戶的新需求。
下載鏈接
????若您想獲得博文中涉及的實現完整全部資源文件(包括測試圖片、視頻,py, UI文件,訓練數據集、訓練代碼、界面代碼等),這里已打包上傳至博主的面包多平臺,見可參考博客與視頻,已將所有涉及的文件同時打包到里面,點擊即可運行,完整文件截圖如下:
完整資源中包含數據集及訓練代碼,環境配置與界面中文字、圖片、logo等的修改方法請見視頻,項目完整文件下載請見演示與介紹視頻的簡介處給出:???
演示與介紹視頻:https://www.bilibili.com/video/BV1iH4y1j7L9/
????在文件夾下的資源顯示如下,下面的鏈接中也給出了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/v5模型的夜視行人檢測系統。系統以模塊化的方式設計,充分采用了合理的架構設計,帶來良好的可維護性和可擴展性。其用戶界面友好,能夠提供實時的夜視行人目標檢測和識別結果展示,同時支持用戶賬戶管理,以便于保存和管理檢測結果和設置。
????????該系統支持攝像頭、視頻、圖像和批量文件等多種輸入源,能夠滿足用戶在不同場景下的需求。在后面可以添加更多預訓練模型,增加檢測和識別的種類;優化用戶界面,增強個性化設置;并積極聆聽用戶反饋,以期不斷改進系統,以更好地滿足用戶的需求。
結束語
????????由于博主能力有限,博文中提及的方法即使經過試驗,也難免會有疏漏之處。希望您能熱心指出其中的錯誤,以便下次修改時能以一個更完美更嚴謹的樣子,呈現在大家面前。同時如果有更好的實現方法也請您不吝賜教。
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. ??
周飛,郭杜杜,王洋,王慶慶,秦音,楊卓敏,賀海軍.基于改進YOLOv8的交通監控車輛檢測算法[J/OL].計算機工程與應用. ?? ?? ??