前言
本項(xiàng)目效果展示視頻:
https://www.bilibili.com/video/BV1bj411S7rA/?share_source=copy_web&vd_source=138d2e7f294c3405b6ea31a67534ae1a
1、本項(xiàng)目通過YOLOv8/YOLOv7/YOLOv5、Dlib和PySide2實(shí)現(xiàn)了一個疲勞駕駛檢測系統(tǒng),可為一些同學(xué)的課設(shè)、大作業(yè)等提供參考。該項(xiàng)目分為兩個檢測部分,疲勞檢測和分心行為檢測。 疲勞檢測部分,使用Dlib進(jìn)行人臉關(guān)鍵點(diǎn)檢測,然后通過計(jì)算眼睛和嘴巴的開合程度來判斷是存在否閉眼或者打哈欠,并使用Perclos模型計(jì)算疲勞程度。 分心行為檢測部分,使用YOLOv8/YOLOv7/YOLOv5檢測是否存在玩手機(jī)、抽煙、喝水這三種行為。最終檢測效果如圖所示。
2、本項(xiàng)目提供玩手機(jī)、抽煙、喝水這三種行為的xml格式目標(biāo)檢測數(shù)據(jù)集,共3547張圖片,如圖所示??捎糜谧约河?xùn)練,可將YOLOv8/YOLOv7/YOLOv5版本的項(xiàng)目均可提供。
一、項(xiàng)目環(huán)境配置
不熟悉pycharm的anaconda的大兄弟請先看這篇csdn博客,了解pycharm和anaconda的基本操作。
https://blog.csdn.net/ECHOSON/article/details/117220445
anaconda安裝完成之后請切換到國內(nèi)的源來提高下載速度 ,命令如下:
conda config --remove-key channels
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.bfsu.edu.cn/anaconda/cloud/pytorch/
conda config --set show_channel_urls yes
pip config set global.index-url https://mirrors.ustc.edu.cn/pypi/web/simple
首先創(chuàng)建python3.8的虛擬環(huán)境,請?jiān)诿钚兄袌?zhí)行下列操作:
conda create -n yolov8 python==3.8.5
conda activate yolov8
1、pytorch安裝(gpu版本和cpu版本的安裝)
實(shí)際測試情況是YOLOv8在CPU和GPU的情況下均可使用,不過在CPU的條件下訓(xùn)練那個速度會令人發(fā)指,所以有條件的小伙伴一定要安裝GPU版本的Pytorch,沒有條件的小伙伴最好是租服務(wù)器來使用。GPU版本安裝的具體步驟可以參考這篇文章:https://blog.csdn.net/ECHOSON/article/details/118420968。
需要注意以下幾點(diǎn):
1、安裝之前一定要先更新你的顯卡驅(qū)動,去官網(wǎng)下載對應(yīng)型號的驅(qū)動安裝
2、30系顯卡只能使用cuda11的版本
3、一定要創(chuàng)建虛擬環(huán)境,這樣的話各個深度學(xué)習(xí)框架之間不發(fā)生沖突
我這里創(chuàng)建的是python3.8的環(huán)境,安裝的Pytorch的版本是1.8.0,命令如下:
conda install pytorch==1.8.0 torchvision torchaudio cudatoolkit=10.2 # 注意這條命令指定Pytorch的版本和cuda的版本
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cpuonly # CPU的小伙伴直接執(zhí)行這條命令即可
安裝完畢之后,我們來測試一下GPU是否可以有效調(diào)用:
2、pycocotools的安裝
pip install pycocotools-windows
3、其他包的安裝
另外的話大家還需要安裝程序其他所需的包,包括opencv,matplotlib這些包,不過這些包的安裝比較簡單,直接通過pip指令執(zhí)行即可,我們cd到y(tǒng)olov8代碼的目錄下,直接執(zhí)行下列指令即可完成包的安裝。
pip install -r requirements.txt
pip install pyqt5
pip install labelme
二、玩手機(jī)、抽煙、喝水三種行為的檢測算法及代碼解讀
1、YOLOv5介紹(YOLOv8/YOLOv7/YOLOv5版本均可提供)
YOLOv5是一種單階段目標(biāo)檢測算法,該算法在YOLOv4的基礎(chǔ)上添加了一些新的改進(jìn)思路,使其速度與精度都得到了極大的性能提升。主要的改進(jìn)思路如下:
1、輸入端:在模型訓(xùn)練階段,提出了一些改進(jìn)思路,主要包括Mosaic數(shù)據(jù)增強(qiáng)、自適應(yīng)錨框計(jì)算、自適應(yīng)圖片縮放;
2、基準(zhǔn)網(wǎng)絡(luò):融合其它檢測算法中的一些新思路,主要包括:Focus結(jié)構(gòu)與CSP結(jié)構(gòu);
3、Neck網(wǎng)絡(luò):目標(biāo)檢測網(wǎng)絡(luò)在BackBone與最后的Head輸出層之間往往會插入一些層,YOLOv5中添加了FPN+PAN結(jié)構(gòu);
4、Head輸出層:輸出層的錨框機(jī)制與YOLOv4相同,主要改進(jìn)的是訓(xùn)練時的損失函數(shù)GIOU_Loss,以及預(yù)測框篩選的DIOU_nms。
YOLOv5的模型整體結(jié)構(gòu)如圖所示,在本項(xiàng)目算法中, YOLOv5用于目標(biāo)檢測,即檢測face、drink、phone、smoke四個目標(biāo)類別。從而判斷駕駛員是否存在玩手機(jī)、抽煙、喝水這三種行為,并將檢測出來的駕駛員人臉進(jìn)行框出。
2、算法實(shí)現(xiàn)
使用YOLOv8/YOLOv7/YOLOv5對當(dāng)前攝像頭采集的實(shí)時畫面進(jìn)行推理后,可得到相關(guān)目標(biāo)檢測結(jié)果,包括畫面中的目標(biāo)框類別、目標(biāo)的置信度、目標(biāo)框的左上角和右下角坐標(biāo)(以實(shí)時圖像的左上角為坐標(biāo)原點(diǎn))。再使用一個for循環(huán)讀取存放了目標(biāo)類別的列表lab,并使用if-else語句對取出的目標(biāo)類別進(jìn)行判斷,若目標(biāo)為"phone"、“smoke”、"drink"中的一種,則分別在前端ui界面中用紅色字體顯示“正在用手機(jī)”、“正在抽煙”、“正在喝水”、“請不要分心”字符串。對存在分心行為的駕駛員進(jìn)行警示提醒。判斷代碼如下所示:
# 如果檢測到分心行為
# 將信息返回到前端ui,使用紅色字體來體現(xiàn)
# 并加ActionCOUNTER減1,以延長循環(huán)時間
for i in lab:
if(i == "phone"):
window.label_6.setText("<font color=red>正在用手機(jī)</font>")
window.label_9.setText("<font color=red>請不要分心</font>")
if ActionCOUNTER > 0:
ActionCOUNTER -= 1
elif(i == "smoke"):
window.label_7.setText("<font color=red>正在抽煙</font>")
window.label_9.setText("<font color=red>請不要分心</font>")
if ActionCOUNTER > 0:
ActionCOUNTER -= 1
elif(i == "drink"):
window.label_8.setText("<font color=red>正在喝水</font>")
window.label_9.setText("<font color=red>請不要分心</font>")
if ActionCOUNTER > 0:
ActionCOUNTER -= 1
3、效果展示
3.1 玩手機(jī)行為檢測效果展示
若檢測到玩手機(jī)行為,則在界面的右邊以紅色字體提示“正在用手機(jī)”、“請不要分心”,對駕駛員起到警示提醒的作用。并在左側(cè)的實(shí)時顯示畫面中對手機(jī)進(jìn)行框出,同時顯示手機(jī)目標(biāo)的置信度。
3.2 抽煙行為檢測效果展示
同理,若在攝像頭采集的實(shí)時畫面中檢測到抽煙的行為,則使用“smoke”對煙進(jìn)行框出,并顯示煙的目標(biāo)置信度。同時在顯示窗口的右側(cè)以紅色字體提示駕駛?cè)藛T“正在抽煙”、“請不要分心”。
3.3 喝水行為檢測效果展示
喝水行為的檢測與抽煙、玩手機(jī)行為檢測類似,可以看到,本文算法也能夠?qū)人袨檫M(jìn)行有效檢測。
三、基于Dlib庫進(jìn)行閉眼、打哈欠疲勞檢測算法及代碼解讀
1、Dlib庫人臉關(guān)鍵點(diǎn)檢測庫
Dlib是一個用C++開發(fā)的開源工具包,可以用于創(chuàng)建復(fù)雜的機(jī)器學(xué)習(xí)算法來解決實(shí)際問題,目前已被廣泛的應(yīng)用在工業(yè)和學(xué)術(shù)領(lǐng)域,包括機(jī)器人,嵌入式設(shè)備,移動電話和大型高性能計(jì)算環(huán)境。相對于tensorflow和PyTorch,它在圖像處理以及人臉面部特征提取、分類及對比這幾個方面具有較強(qiáng)的通用性和優(yōu)越性。因此,Dlib正在越來越廣泛地應(yīng)用在人臉識別技術(shù)領(lǐng)域。這個庫使用獨(dú)立封裝,在不借助第三方庫的情況下,可以直接移植到自己的項(xiàng)目中進(jìn)行使用。
2、算法流程
在本算法中首先創(chuàng)建一個人臉檢測器對象frontal_face_detector來檢測圖像中是否存在人臉,若存在人臉,則使用detector對象檢測圖像中的人臉,并返回人臉位置信息。然后再創(chuàng)建一個關(guān)鍵點(diǎn)檢測器對象shape_predictor,并讀取本項(xiàng)目中已訓(xùn)練好的模型文件。最后,對于每個人臉使用shape_predictor對象檢測出其關(guān)鍵點(diǎn),輸出的shape對象即為檢測到的關(guān)鍵點(diǎn)信息。對于閉眼疲勞檢測而言,首先基于dlib人臉識別的68個特征點(diǎn)、分別獲取左右眼面部標(biāo)志的索引,通過opencv對視頻流進(jìn)行灰度化處理,檢測出人眼的位置信息。然后計(jì)算眼睛長寬比 EAR,當(dāng)人眼睜開時,EAR在某個值上下波動,當(dāng)人眼閉合時,EAR迅速下降,理論上會接近于零。當(dāng)前幀兩雙眼睛寬高比與前一幀的差值的絕對值(EAR)大于0.2,則認(rèn)為是疲勞。對于打哈欠疲勞檢測而言,只要產(chǎn)生打哈欠的動作即歸類為“疲勞”。主要取人臉六個參考點(diǎn)來計(jì)算嘴巴的張開度,檢測到嘴巴張開度超過一定閾值,則判為打哈欠疲勞。
3、核心代碼
本項(xiàng)目將眨眼、打哈欠的疲勞檢測寫到了myfatigue.py腳本里面,有詳細(xì)注釋,調(diào)用即可。在main.py中進(jìn)行疲勞判斷的核心代碼如下:
# 疲勞判斷
# 眨眼判斷
if eye < EYE_AR_THRESH:
# 如果眼睛開合程度小于設(shè)定好的閾值
# 則兩個和眼睛相關(guān)的計(jì)數(shù)器加1
COUNTER += 1
Rolleye += 1
else:
# 如果連續(xù)2次都小于閾值,則表示進(jìn)行了一次眨眼活動
if COUNTER >= EYE_AR_CONSEC_FRAMES:
TOTAL += 1
window.label_3.setText("眨眼次數(shù):" + str(TOTAL))
# 重置眼幀計(jì)數(shù)器
COUNTER = 0
# 哈欠判斷,同上
if mouth > MAR_THRESH:
mCOUNTER += 1
Rollmouth += 1
else:
# 如果連續(xù)3次都小于閾值,則表示打了一次哈欠
if mCOUNTER >= MOUTH_AR_CONSEC_FRAMES:
mTOTAL += 1
window.label_4.setText("哈欠次數(shù):" + str(mTOTAL))
# 重置嘴幀計(jì)數(shù)器
mCOUNTER = 0
4、效果展示
將檢測出的左右眼部、嘴部區(qū)域關(guān)鍵點(diǎn)使用橢圓形綠色線框進(jìn)行繪制,并在界面右側(cè)的第一行文本提醒區(qū)域“疲勞檢測”使用紅色字體提示“疲勞?。?!”,從而對存在眨眼、打哈欠疲勞行為的駕駛?cè)藛T進(jìn)行提示警告。另外,在界面右側(cè)的第二行文本中統(tǒng)計(jì)當(dāng)前攝像頭畫面中駕駛?cè)藛T的眨眼次數(shù)和打哈欠次數(shù),并進(jìn)行實(shí)時顯示。
四、使用Perclos模型計(jì)算疲勞程度算法及代碼解讀
1、算法流程
Perclos疲勞參數(shù)是指在單位時間內(nèi)眼睛閉合程度超過某一閾值(70%、80%等)的時間占總時間的百分比。目前,Perclos方法有三種判斷疲勞的不同準(zhǔn)則,分別為EM準(zhǔn)則、P70準(zhǔn)則、P80準(zhǔn)則。其具體含義如下:
EM準(zhǔn)則:瞳孔被眼瞼覆蓋超50%的面積,則認(rèn)為眼睛是閉合的;
P70準(zhǔn)則:瞳孔被眼瞼覆蓋超70%的面積,則認(rèn)為眼睛是閉合的;
P80準(zhǔn)則:瞳孔被眼瞼覆蓋超過80%的面積,則認(rèn)為眼睛是閉合的。
本項(xiàng)目考慮到,當(dāng)人注意力特別集中或處在沉思狀態(tài)時可能也會有眼瞼覆蓋瞳孔超過50%甚至70%的可能,所以采用的是P80準(zhǔn)則。
2、核心代碼
本項(xiàng)目中疲勞判斷以150幀作為一個周期,計(jì)算出的Perclos模型得分超過0.38時,判為疲勞狀態(tài)。核心判斷代碼如下:
# 疲勞模型
# 以150幀為一個循環(huán)
# 每一幀Roll加1
Roll += 1
# 當(dāng)檢測滿150幀時,計(jì)算模型得分
if Roll == 150:
# 計(jì)算Perclos模型得分
perclos = (Rolleye/Roll) + (Rollmouth/Roll)*0.2
# 在前端UI輸出perclos值
Ui_MainWindow.printf(window,"過去150幀中,Perclos得分為"+str(round(perclos,3)))
# 當(dāng)過去的150幀中,Perclos模型得分超過0.38時,判斷為疲勞狀態(tài)
if perclos > 0.38:
Ui_MainWindow.printf(window,"當(dāng)前處于疲勞狀態(tài)")
window.label_10.setText("<font color=red>疲勞!?。?lt;/font>")
Ui_MainWindow.printf(window,"")
else:
Ui_MainWindow.printf(window,"當(dāng)前處于清醒狀態(tài)")
window.label_10.setText("清醒")
Ui_MainWindow.printf(window,"")
3、效果展示
本項(xiàng)目在顯示控件里設(shè)置了一個窗口,用于實(shí)時顯示疲勞分?jǐn)?shù)計(jì)算結(jié)果和判斷結(jié)果。如圖所示,當(dāng)循環(huán)判斷150幀中Perclos模型得分超過0.38時,判為疲勞狀態(tài),并顯示字符串“當(dāng)前處于疲勞狀態(tài)”進(jìn)行提醒。否則,輸出字符串“當(dāng)前處于清醒狀態(tài)”。該閾值預(yù)設(shè)為0.38,可根據(jù)不同的需求進(jìn)行手動調(diào)節(jié),以使算法獲得不同的疲勞判斷靈敏度。
五、總結(jié)及源碼獲取
1、總結(jié)
為有效監(jiān)測駕駛員狀態(tài)、避免交通事故的發(fā)生,本項(xiàng)目利用YOLOv8/YOLOv7/YOLOv5目標(biāo)檢測技術(shù)、人臉關(guān)鍵點(diǎn)檢測分析技術(shù)結(jié)合的新方法,對駕駛員的分心、疲勞駕駛行為進(jìn)行實(shí)時監(jiān)控。首先對駕駛員的抽煙、玩手機(jī)、喝水行為進(jìn)行目標(biāo)檢測;然后根據(jù)眼睛區(qū)域的Dlib關(guān)鍵點(diǎn)坐標(biāo)信息計(jì)算眼睛縱橫比EAR來衡量眼睛張開程度,根據(jù)合適的EAR閾值可判斷睜眼或閉眼狀態(tài),并判斷打哈欠的行為;最后基于EAR實(shí)測值和EAR閾值對監(jiān)控視頻計(jì)算閉眼時間比例(Perclos),度量駕駛員主觀疲勞程度,將其與設(shè)定的疲勞度閾值進(jìn)行比較即可判定是否疲勞駕駛。
2、項(xiàng)目資源獲取(YOLOv8/YOLOv7/YOLOv5版本均可提供)
項(xiàng)目內(nèi)容:
包含完整word版本說明文檔,可用于寫論文、課設(shè)報(bào)告的參考。
資源獲?。?mark hidden color="red">文章來源:http://www.zghlxwxcb.cn/news/detail-752943.html
獲取整套代碼、測試視頻、訓(xùn)練好的權(quán)重、說明文檔和相應(yīng)的目標(biāo)檢測數(shù)據(jù)集(有償)
上交碩士,技術(shù)夠硬,也可以指導(dǎo)深度學(xué)習(xí)畢設(shè)、大作業(yè)等。
------------- -->qq: 3582584734 ---------------
文章來源地址http://www.zghlxwxcb.cn/news/detail-752943.html
到了這里,關(guān)于疲勞駕駛檢測系統(tǒng)-YOLOv8/YOLOv7/YOLOv5-疲勞檢測、分心檢測、玩手機(jī)、抽煙、喝水檢測(畢業(yè)設(shè)計(jì))的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!