摘要:開發口罩識別系統對于提升公共衛生安全和疫情防控具有重要意義。本篇博客詳細介紹了如何利用深度學習構建一個口罩識別系統,并提供了完整的實現代碼。該系統基于強大的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界面+訓練數據集)
前言
????????近年來,隨著全球范圍內公共衛生事件的爆發,口罩檢測技術得到了迅速發展和廣泛應用。這項技術主要集中在通過圖像識別和機器學習方法來自動識別人群中是否佩戴口罩,以及口罩佩戴的正確性。當前的研究重點包括了提高檢測準確性、降低誤報率、以及增強系統對不同環境條件(如不同光線和背景)的適應性。
????????早期的口罩檢測主要依賴于傳統的圖像處理技術,如邊緣檢測、顏色分析等。在過去幾年中,隨著人工智能和機器學習技術的快速發展,口罩檢測技術也取得了顯著進步。目前,最常見的技術是基于深度學習的面部識別系統,這些系統通過訓練大量的帶口罩和不帶口罩的面部圖像,來提高識別的準確性。卷積神經網絡(CNN)的發展,口罩檢測的準確度和效率得到了顯著提升1。
????????隨著YOLO(You Only Look Once)系列目標檢測算法的出現和發展,已經提出了更高效、更精準的目標檢測工具。從最早的YOLO2,到YOLO90003,再到YOLOv44,YOLOv5等,這一系列的發展都在推動著目標檢測技術的進步。在去年美團發布了YOLOv65,然后緊接著YOLOv76,到現在的YOLOv87,這個最新版本在許多方面都進行了優化與改進,如使用了更復雜的網絡架構,更精細的預測機制,以及加入了對小目標的更好處理。
????????注意力機制,尤其是自注意力(Self-Attention),在眾多深度學習模型中扮演著重要角色。它能夠使模型聚焦于輸入數據中的關鍵部分,對于理解圖像中的復雜模式特別有效。在口罩識別等視覺任務中,注意力機制有助于模型更好地區分遮擋和非遮擋的面部區域,從而提升識別性能。
????????MMDetection是一個開源的目標檢測工具箱,提供了豐富的目標檢測和實例分割算法,包括但不限于Faster R-CNN、Mask R-CNN、YOLO等。MMDetection以其模塊化和可擴展性強的特點,支持快速實驗和研究不同算法的組合,對于開發和測試新的口罩識別模型極為有用。
????????在COVID-19疫情期間,許多公共場所部署了口罩檢測系統以確保人們遵守佩戴口罩的規定。此外,這項技術也被應用于機場安檢、公共交通系統以及一些需要身份驗證的場合口罩檢測技術在當前的公共衛生危機中發揮了重要作用。口罩檢測作為一個新興的研究領域,隨著技術的不斷進步和社會需求的變化,其發展潛力巨大。然而,為了充分發揮其價值,需要克服當前的技術挑戰,并且在尊重個人隱私和倫理原則的基礎上進行發展。未來的研究將更加注重系統的準確性、適應性和用戶體驗,以更好地服務于公共健康和安全。
????????盡管口罩檢測技術取得了一定的進展,但是仍面臨一些挑戰。例如,不同類型和顏色的口罩可能會影響檢測的準確性。此外,環境因素如光照條件和背景噪聲也可能對系統的性能產生影響,還需要確保這項技術的使用不侵犯個人隱私權。
????????本博客所做的工作是基于YOLOv8算法構建一個口罩檢測系統,展示系統的界面效果,詳細闡述其算法原理,提供代碼實現,以及分享該系統的實現過程。希望本博客的分享能給予讀者一定的啟示,推動更多的相關研究。本文的主要貢獻如下:
- 采用最先進的YOLOv8算法進行口罩識別: 我們深入探討了YOLOv8算法在口罩識別任務中的應用,展示了其在效率和精準度方面相比于YOLOv7、YOLOv6、YOLOv5等早期版本的顯著優勢。通過對這些算法的細致對比,本文不僅展示了YOLOv8的先進性,也為研究者和從業者提供了價值的參考,鼓勵他們在未來的研究中考慮采用更高效的算法。
- 利用PySide6實現用戶界面友好的口罩識別系統: 本文詳細介紹了如何使用Python的PySide6庫開發一個既美觀又易于操作的口罩識別系統界面。這一貢獻不僅提高了口罩識別系統的可用性,也促進了高效算法如YOLOv8在實際應用中的普及和應用。
- 設計了登錄管理功能以提升系統安全性: 系統集成了登錄管理功能,增強了使用過程中的安全保障,并為后續開發個性化服務打下了基礎。這一創新點兼顧了用戶體驗和系統安全,體現了本研究在系統設計方面的綜合考慮。
- 對YOLOv8模型進行了深入研究: 除了應用實現,本文還對YOLOv8模型的性能進行了全面的評估和分析,包括精確度、召回率以及在不同條件下的表現等,為了解和優化YOLOv8算法提供了堅實的基礎。
- 提供完整的數據集和代碼資源包: 為了促進學術共享和技術傳播,本文提供了一套完整的數據集和代碼資源包,使讀者能夠輕松復現研究結果,并在此基礎上進行進一步的研究和開發。
1. 數據集介紹
????????在這個博客章節中,我們將詳細介紹為口罩識別系統構建的專用數據集。數據集的質量直接影響著機器學習模型的訓練效果和最終性能,因此,我們精心準備和預處理了這個包含2000張圖像的數據集,旨在為研究人員和開發者提供一個堅實的基礎,以開發和評估他們的口罩識別模型。本數據集的構成相當平衡,其中包含1200張訓練圖像、400張驗證圖像以及400張測試圖像。這種劃分確保了模型可以在充足的數據上進行訓練,同時也有足夠的數據進行驗證和獨立測試,以避免過擬合并評估模型的泛化能力。所有圖像均經過嚴格的預處理,包括自動方向校正和EXIF方向信息的剝離,確保所有圖像在輸入模型前方向一致。此外,為了適應目標檢測算法的要求,所有圖像都被標準化為640x640像素的尺寸,通過拉伸的方式進行調整。自適應均衡化技術也被用來增強圖像的對比度,這有助于模型在不同光照條件下更準確地識別口罩。
????????數據標注的準確性對于訓練高效的目標檢測模型至關重要。在我們的數據集中,每張圖像都被精確標注,定義了戴口罩和未戴口罩兩個類別。從類別分布上看,戴口罩的樣本數量略多于未戴口罩,反映了當前公共衛生情況下對戴口罩情形的重視。標注框的分布分析顯示,大多數標注框的中心點集中在圖像中心區域,這可能與實際場景中人臉位置相對攝像頭的中心位置有關。標注框的尺寸多集中在一定的范圍內,表明大部分人臉標注框的大小比例相對一致,有利于模型識別和預測。
????????盡管數據集在一致性和準確性上表現良好,但我們也注意到標注框在圖像中的位置和尺寸存在一定程度的集中趨勢。為了提升模型的泛化能力,我們建議在未來的工作中可以通過更多樣化的數據增強技術來擴展數據集的多樣性。例如,加入更多不同位置和尺寸比例的人臉圖像,以及進行隨機裁剪、旋轉和色彩調整等操作。博主使用的類別代碼如下:
Chinese_name = {'mask': "佩戴口罩",'no-mask': "未戴口罩", }
????????總之,我們提供的這個數據集旨在為口罩識別任務提供一個堅實的訓練和測試基礎。通過細致的預處理和嚴格的標注流程,我們確保了數據集的高質量和實用性。同時,我們也期望通過本文分享的數據集分析,能夠啟發更多的研究人員和開發者在此基礎上進行創新和改進。未來,我們也計劃不斷完善和擴充這個數據集,以支持口罩識別技術的發展和應用。
2. 系統界面效果
????????系統以PySide6作為GUI庫,提供了一套直觀且友好的用戶界面。下面,我將詳細介紹各個主要界面的功能和設計。
(1)系統提供了基于SQLite的注冊登錄管理功能。用戶在首次使用時需要通過注冊界面進行注冊,輸入用戶名和密碼后,系統會將這些信息存儲在SQLite數據庫中。注冊成功后,用戶可以通過登錄界面輸入用戶名和密碼進行登錄。這個設計可以確保系統的安全性,也為后續添加更多個性化功能提供了可能性。
(2)在主界面上,系統提供了支持圖片、視頻、實時攝像頭和批量文件輸入的功能。用戶可以通過點擊相應的按鈕,選擇要進行口罩檢測的圖片或視頻,或者啟動攝像頭進行實時檢測。在進行檢測時,系統會實時顯示檢測結果,并將檢測記錄存儲在數據庫中。
(3)此外,系統還提供了一鍵更換YOLOv8模型的功能。用戶可以通過點擊界面上的"更換模型"按鈕,選擇不同的YOLOv8模型進行檢測。與此同時,系統附帶的數據集也可以用于重新訓練模型,以滿足用戶在不同場景下的檢測需求。
(4)為了提供更個性化的使用體驗,這里系統支持界面修改,用戶可以自定義圖標、文字等界面元素。例如,用戶可以根據自己的喜好,選擇不同風格的圖標,也可以修改界面的文字描述。
3. YOLOv8算法原理
????????YOLOv8(You Only Look Once version 8)是一種最新的、用于目標檢測、圖像分類和實例分割任務的先進YOLO模型。YOLOv8與前代產品相比,專注于提高準確性和效率。
????????YOLOv8算法提供了一個全新的SOTA模型,可用于計算機視覺領域的目標檢測、圖像分類、實例分割和目標跟蹤等任務。YOLOv8的主要結構包括主干特征提取網絡(Backbone)、特征強化提取網絡(Neck)以及檢測頭(Head)三個部分。其網絡結構圖如下圖所示。
????????骨干網絡和Neck部分跨階段局部網絡(Cross Stage Partial Network,CSP)模塊的預處理從三次卷積換成了兩次卷積,借鑒YOLOv7 ELAN模塊多堆疊的設計思想,將YOLOv5的C3結構換成了梯度流更豐富的C2f結構,并對不同尺度模型調整了不同的通道數,使網絡能夠學習到更多的特征,并且具有更強的魯棒性。CSP模塊的預處理從三次卷積換成了兩次卷積,并且借鑒了YOLOv7的多堆疊結構。具體的實現方式是第一次卷積的通道數擴充為原來的兩倍,然后將卷積結果在通道上對半分割,這樣可以減少一次卷積的次數,加快網絡的速度。8
????????檢測頭部分,YOLOv8采用無錨分體式檢測頭,與基于錨框的方法相比,有助于提高準確性和更高效的檢測過程。Head部分較YOLOv5而言有兩大改進。首先,換成了目前主流的解耦頭結構,將分類和檢測頭分離,用于緩解分類和定位任務之間存在的沖突;其次,參考YOLOX,從Anchor-Based換成了AnchorFree,面對長寬不規則的目標比較有優勢。8
????????損失函數計算部分,YOLOv8的Loss計算包括兩個部分:分類分支和回歸分支。分類分支依然采用BCELoss,回歸分支需要和分布式聚焦損失函數(DistributionFocalLoss,DFL)中提出的積分形式表示法綁定,因此使用了DFL,同時還使用了(Complete Intersection over Union, CIoU)Loss。8
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/val_178.jpg")
image = cv_imread(img_path)
????????在讀取了圖像文件之后,將圖像大小調整為850x500,并對圖像進行預處理,就可以使用模型進行預測了。
image = cv2.resize(image, (850, 500))
pre_img = model.preprocess(image)
pred, superimposed_img = model.predict(pre_img)
4.2 模型訓練
????????在模型訓練部分,首先導入YOLO模型,并加載了預訓練的YOLOv8模型。
from ultralytics import YOLO
model = YOLO('./weights/yolov8s.pt', task='detect')
????????賦值data_name,獲取數據集的yaml的絕對路徑。
data_name = "MaskDataset"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current') # 數據集的yaml的絕對路徑
unix_style_path = data_path.replace(os.sep, '/')
????????接著開始訓練模型。其中指定了訓練數據的配置文件路徑,使用CPU進行訓練,使用2個工作進程加載數據,輸入圖像的大小為640x640,訓練100個epoch,每個批次的大小為8。
results = model.train( data=data_path, device='cpu', workers=2, imgsz=640, epochs=100, batch=8, name='train_v8_' + data_name
)
????????在深度學習中,我們通常通過損失函數下降的曲線來觀察模型訓練的情況。在訓練結束后,我們也可以在logs目錄下找到生成對若干訓練過程統計圖。下圖為博主訓練口罩目標檢測過程中訓練情況截圖,以及損失函數曲線圖,展示了模型在訓練和驗證過程中的性能指標變化。
????????首先,訓練集上的損失函數圖表中,我們可以看到隨著訓練的進行,框損失(train/box_loss)、分類損失(train/cls_loss)和目標損失(train/obj_loss)都呈現出了下降的趨勢,并且在經過一定數量的訓練周期后,損失值開始趨于穩定。這表明模型在識別目標的位置、分類及存在性上都取得了學習效果,并且隨著訓練的進行,其性能穩步提升。然而,在驗證集上,損失函數值相比訓練集要高,且波動更大。這可能是由于模型在驗證數據上的泛化能力不如在訓練集上那樣強,或是驗證集中包含了更多訓練集未覆蓋的難以識別的樣本。驗證集上的框損失(val/box_loss)、分類損失(val/cls_loss)和目標損失(val/obj_loss)雖然在訓練過程中逐漸下降,但損失值的波動表明模型對于未見數據的適應性還有待提高。
????????從模型的精度(precision)和召回率(recall)圖中可以觀察到,模型在訓練過程中逐漸達到較高的精度和召回率,這意味著模型能夠較好地識別出數據集中的正樣本,并且在它識別出來的樣本中,有較高比例是正確的。但是,我們也注意到精度和召回率的曲線在訓練過程中出現了一些波動,這可能是由于模型在某些訓練批次中遇到了難以分類的樣本,或是訓練數據中存在一些噪聲。最后,評估模型性能的另一個重要指標是平均精度均值(mAP),其中mAP@0.5和mAP@0.5:0.95分別代表了模型在IOU閾值為0.5時和0.5到0.95這個范圍內的平均精度。mAP@0.5的曲線顯示出模型在IOU閾值為0.5時有著較好的性能,而mAP@0.5:0.95的波動則暗示在更為嚴格的IOU閾值下,模型的表現存在一定程度的波動。這可能表明模型在更精確地定位目標上仍有改進的空間。
????????精確度-召回率(Precision-Recall,簡稱PR)曲線是評估分類模型性能的重要工具,尤其是在數據集類別分布不平衡的情況下。PR曲線上的每一點對應一個閾值,該閾值決定了模型預測正樣本的條件,從而影響到精確度和召回率的值。通常情況下,精確度高意味著較少的假陽性,召回率高意味著較少的假陰性。
???????? 從曲線圖中可以看出,“no-mask”類別的PR曲線(橙色)高于“mask”類別(藍色),且“no-mask”類別的mAP@0.5值達到了0.948,而“mask”類別的mAP@0.5值為0.824。這表明模型在檢測未戴口罩的樣本時更加精確和可靠。高精確度表示在模型預測為“no-mask”類別的樣本中,有較高比例確實是未戴口罩的。同時,高召回率表明模型能夠識別出大部分實際未戴口罩的樣本。相比之下,戴口罩類別的精確度和召回率較低,可能是因為戴口罩的樣本在視覺特征上更加多樣化,或者因為口罩遮擋了部分面部特征,增加了識別的難度。
???????? 所有類別合并后的mAP@0.5值為0.886,說明整體模型在IOU閾值為0.5時具有較高的平均檢測準確性。這個值結合了所有類別的檢測性能,可以視為模型整體性能的指標。值得注意的是,PR曲線圖中“mask”類別的曲線在召回率接近1時精確度急劇下降,這意味著為了盡可能不遺漏戴口罩的樣本(即提高召回率),模型不得不降低判斷標準,導致一些實際未戴口罩的樣本被錯誤地分類為戴口罩,從而減少了精確度。
???????? 總體而言,模型在“no-mask”類別上的表現比“mask”類別更優,可能是由于未戴口罩的臉部特征更容易被模型捕捉。未來的工作可以著重于提高戴口罩類別的精確度和召回率,例如通過增加戴口罩樣本的多樣性、優化模型對遮擋特征的學習能力或調整分類閾值。此外,模型整體表現良好,但應繼續探索提升“mask”類別檢測性能的方法,以實現更均衡的分類效果。通過這些分析,我們可以更深入地理解模型在各個類別上的表現,并指導后續的模型優化和改進策略。
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.879 | 0.740 | 0.723 | 0.886 |
F1-Score | 0.85 | 0.77 | 0.78 | 0.86 |
(3)實驗結果分析:
??????? 在深度學習領域,持續的算法迭代和更新是提升模型性能的關鍵途徑。我們通過在相同的數據集上實施一系列實驗,旨在比較和評估不同版本的YOLO模型——包括YOLOv5nu、YOLOv6n、YOLOv7-tiny以及YOLOv8n——在口罩識別任務上的性能。實驗的設計和目的是為了明確各版本模型在準確性和檢測效率上的差異,以便為實際應用提供更具指導性的見解。
??????? 我們可以看到YOLOv5nu和YOLOv8n的表現相較于YOLOv6n和YOLOv7-tiny有顯著的提升。YOLOv5nu的mAP為0.879,而F1-Score為0.85,這表明YOLOv5nu在平衡假陽性和假陰性方面做得相對較好。它在識別準確性和結果的精確性-召回率平衡上都有著優秀的表現。YOLOv6n的性能在四個版本中是最低的,mAP為0.740,F1-Score為0.77。mAP較低可能表明它在各種閾值下的平均精確度較低,而較低的F1-Score表明精確度與召回率之間存在較大的平衡問題。
??????? YOLOv7-tiny,作為一個輕量級版本,其性能略高于YOLOv6n,mAP和F1-Score分別為0.723和0.78。盡管作為一個“tiny”版本,它在資源受限的環境下可能是一個較好的選擇,但在性能方面仍有所欠缺。YOLOv8n展現了最優秀的性能,mAP達到了0.886,F1-Score為0.86,這說明YOLOv8n不僅在整體的平均檢測準確性上表現出色,而且在精確度與召回率之間達到了很好的平衡。這可能歸功于YOLOv8版本在算法結構上的優化,例如更有效的特征提取網絡、更好的訓練策略以及更先進的損失函數等。
??????? 從這些數據可以看出,隨著YOLO版本的迭代,性能有了顯著的提升,特別是從YOLOv6到YOLOv8的提升最為明顯。這種性能的提升可能是由于算法內部結構的改進,包括更好的卷積網絡結構、注意力機制的引入以及更加高效的損失計算方法。對于實際應用來說,YOLOv8n的高性能使其成為在精確度和速度之間需要權衡時的理想選擇。然而,對于計算資源受限的環境,YOLOv7-tiny依然有其應用的價值。這些分析結果為我們提供了在不同場景下選擇適合的YOLO版本的重要信息。
4.4 代碼實現
????????在這一節中,我們將詳細介紹如何使用YOLOv8實現攝像頭畫面中口罩識別的代碼實現。這個實現主要包括創建主窗口、處理每一幀圖像、加載模型、開始處理媒體流等步驟。
????????在實時口罩識別系統中,結合YOLOv8模型和一系列開源庫,如OpenCV、QtFusion和PySide6等,來實現主窗口的展示、攝像頭幀的處理以及口罩的檢測和標注等功能。
(1)引入必要的庫
????????首先,需要引入一些必要的庫,包括圖像處理庫OpenCV、圖形界面庫QtFusion和PySide6,以及物體檢測模型庫YOLOv8Model等。
import sys
import time import cv2
from QtFusion.BaseFrame import FBaseWindow
from QtFusion.Handler import MediaHandler
from QtFusion.ImageUtils import drawRectBox
from QtFusion.ImageUtils import get_cls_color
from PySide6 import QtWidgets, QtCore
from YOLOv8Model import YOLOv8Detector
(2)設置主窗口
????????在設置主窗口的過程中,定義了一個名為MainWindow的類,該類繼承自QtFusion庫中的FBaseWindow類。在MainWindow類中,設置了窗口的大小,并創建了一個用于顯示圖像的標簽。此外,我們還設置了一個按鍵事件,使得用戶可以通過按Q鍵來關閉窗口。
class MainWindow(FBaseWindow): 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_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()
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current"))
colors = get_cls_color(model.names) app = QtWidgets.QApplication(sys.argv)
window = MainWindow() videoHandler = MediaHandler(fps=30)
videoHandler.frameReady.connect(frame_process)
videoHandler.setDevice(device=0)
videoHandler.startMedia() window.show()
sys.exit(app.exec())
????????在此,"weights/best-yolov8n.pt"是經過大量口罩圖像訓練得到的模型權重文件,而model.names則包含了模型可以識別的所有口罩類別的名稱。這就是實現實時口罩檢測系統的完整代碼,整個過程包括了數據預處理、YOLOv8模型預測、結果后處理和可視化等步驟,結構清晰,邏輯簡潔。通過這樣的方式,可以實現對攝像頭捕獲的畫面進行實時口罩識別和標注。
5. 口罩識別系統實現
????????在實現一款實時口罩識別系統時,我們的目標是打造一個直觀、易于使用且功能強大的用戶界面,同時確保系統的高效和穩定性。我們的設計理念是將復雜的功能模塊化,易于維護和擴展,并且保證用戶與系統的交互盡可能簡潔明了。
5.1 系統設計思路
????????MainWindow類的主要目標是提供一個用戶友好的交互式口罩識別系統。為了實現這個目標,采取了將界面、媒體處理和模型集成在一起的設計思路。通過對象組合的方式,將不同的處理器和模型組織在一起,讓每個功能模塊都能獨立進行,同時,還利用信號和槽機制來進行模塊間的交互和數據傳遞。
架構設計
????????我們的系統設計遵循了經典的MVC(Model-View-Controller)架構模式,將應用程序劃分為三個核心組件:模型(Model)、視圖(View)和控制器(Controller),分別對應我們的處理層、界面層和控制層。
- 處理層(Processing Layer):處理層是系統的數據處理中心,核心由YOLOv8Detector類承擔,該類封裝了YOLOv8模型和相關的數據處理方法。它負責接收輸入數據,運用預訓練的模型進行圖像處理和口罩檢測,并將結果輸出給控制層。此層專注于算法的實現和優化,確保檢測結果的準確性和處理速度。
- 界面層(UI Layer):界面層則是用戶與系統交互的前端,由Ui_MainWindow類實現,它提供了圖形用戶界面(GUI)。用戶可以通過這個界面上傳圖片或視頻進行口罩檢測,界面會展示檢測的實時結果。我們在設計界面時注重用戶體驗,界面布局直觀、操作簡單,以支持非技術用戶的日常使用。
- 控制層(Control Layer):控制層作為橋梁,連接處理層和界面層,由MainWindow類中的方法和槽函數組成。它響應界面層的用戶操作,調用處理層的檢測方法,并將結果反饋到界面上。此外,控制層還負責協調各組件之間的通信,使用Qt的信號和槽機制來實現模塊間的松耦合交互,提高了代碼的可讀性和系統的可靠性。
????????為了進一步提升系統的實用性和可擴展性,我們還考慮到了后續可能的功能迭代和技術升級。系統設計中預留了接口和抽象層,方便未來引入新的檢測模型或升級現有算法,以及添加新的用戶功能,如實時視頻流處理、云端數據同步等。綜上所述,我們的交互式口罩識別系統系統在設計上追求用戶友好性、模塊獨立性和系統可擴展性。通過精心的架構設計,將先進的YOLOv8目標檢測技術與高效的用戶界面相結合,我們為用戶提供了一個強大而直觀的口罩檢測工具。
系統流程
????????以下是口罩識別系統的工作流程:
- 用戶打開應用程序,創建MainWindow類的實例,并初始化界面和相關參數。
- 用戶通過界面操作選擇攝像頭、視頻或圖像作為輸入源。
- 根據用戶選擇的輸入源,調用相應的處理器和方法進行媒體處理和檢測。
- 當媒體輸入啟動成功后,進入循環處理幀的流程:
- 對每一幀圖像進行預處理。
- 使用YOLOv8模型對圖像進行口罩識別,得到檢測結果。
- 根據檢測結果更新界面的顯示,包括繪制檢測框、更新表格數據和條形圖等。
- 用戶可通過按鈕進行保存檢測結果、顯示作者信息和版本信息等操作。
- 用戶可通過控制按鈕來控制攝像頭、視頻和圖像的啟動和停止。
- 用戶可通過表格和下拉菜單選擇特定的檢測結果進行查看和分析。
5.2 登錄與賬戶管理
????????在我們的交互式口罩識別系統中,為了提供更加安全和個性化的用戶體驗,我們精心設計了一套完整的用戶賬戶管理系統。該系統基于PySide6框架構建用戶界面,使用SQLite作為后端數據庫來存儲用戶數據,確保了操作的流暢性和數據的安全性。
????????首先,系統提供了一個直觀的登錄界面,用戶可以在這里進行賬戶的注冊和登錄。我們意識到每個用戶的需求和喜好都是獨特的,因此在賬戶創建過程中,除了基本的身份驗證信息外,用戶還能設置個性化頭像,使每個賬戶都具有獨特的個人標識。一旦注冊完成,用戶便可以使用自己的賬戶在不同設備上登錄系統,無縫地同步個人設置和歷史記錄。
????????除了基礎的注冊和登錄功能外,我們還為用戶提供了密碼修改和賬戶注銷的選項,以滿足用戶對隱私和安全性的關切。用戶可以隨時更新自己的密碼,確保賬戶安全,同時也可以在必要時注銷賬戶,保護個人信息不被他人訪問。
????????在用戶成功登錄系統后,將進入主界面開始口罩識別任務。該系統支持多種數據輸入方式,包括圖片、視頻、實時攝像頭捕獲和批量文件處理。用戶可以在個人空間中管理和查看自己的檢測記錄,包括檢測框、類別及置信度等信息的實時顯示。這些信息不僅可以在主界面實時查看,還可以被保存下來,供用戶日后查閱和分析。
????????此外,我們設計的賬戶管理系統還考慮到了易用性。例如,如果用戶忘記了密碼,我們提供了密碼找回的功能;如果用戶希望在多個設備間同步設置和歷史記錄,我們也提供了相應的支持。通過以上的用戶賬戶管理設計,口罩識別系統能夠滿足用戶在實時目標檢測場景下的各種需求,無論是個人用戶還是企業用戶,都可以依賴這一系統高效、安全地完成口罩識別任務,同時享受個性化的用戶體驗。
下載鏈接
????若您想獲得博文中涉及的實現完整全部資源文件(包括測試圖片、視頻,py, UI文件,訓練數據集、訓練代碼、界面代碼等),這里已打包上傳至博主的面包多平臺,見可參考博客與視頻,已將所有涉及的文件同時打包到里面,點擊即可運行,完整文件截圖如下:
完整資源中包含數據集及訓練代碼,環境配置與界面中文字、圖片、logo等的修改方法請見視頻,項目完整文件下載請見演示與介紹視頻的簡介處給出:???
演示與介紹視頻:https://www.bilibili.com/video/BV1Zi421Z78u/
????在文件夾下的資源顯示如下,下面的鏈接中也給出了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模型的實時口罩識別系統。系統以模塊化的方式設計,充分采用了合理的架構設計,帶來良好的可維護性和可擴展性。其用戶界面友好,能夠提供實時的口罩檢測和識別結果展示,同時支持用戶賬戶管理,以便于保存和管理檢測結果和設置。
????????該系統支持攝像頭、視頻、圖像和批量文件等多種輸入源,能夠滿足用戶在不同場景下的需求。
????????在后面可以添加更多預訓練模型,增加檢測和識別的種類;優化用戶界面,增強個性化設置;并積極聆聽用戶反饋,以期不斷改進系統,以更好地滿足用戶的需求。
結束語
????????由于博主能力有限,博文中提及的方法即使經過試驗,也難免會有疏漏之處。希望您能熱心指出其中的錯誤,以便下次修改時能以一個更完美更嚴謹的樣子,呈現在大家面前。同時如果有更好的實現方法也請您不吝賜教。
Zhang, Y., et al. (2022). “Deep Learning for Mask Detection in the Era of COVID-19.” Journal of Computer Science and Technology. ??
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].計算機工程與應用. https://link.cnki.net/urlid/11.2127.TP.20240104.0953.008 ?? ?? ??