您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么用Python實現駕駛員疲勞檢測”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么用Python實現駕駛員疲勞檢測”吧!
先決條件
該Python項目需要一個網絡攝像頭,用于捕獲圖像。您需要在系統上安裝Python(建議使用3.6版),然后使用pip安裝所需的軟件包。
OpenCV – 使用pip安裝opencv-python(面部和眼部檢測)。
TensorFlow – 使用pip安裝tensorflow(keras使用TensorFlow作為后端)。
Keras – 使用pip安裝keras(建立分類模型)。
Pygame – 使用pip安裝pygame(播放警告提示音)。
數據集
需要創建用于此模型的數據集。為創建數據集,我們編寫了一個腳本來捕獲攝像機中的人眼圖像并將其存儲在本地磁盤中,將人眼圖像分為“睜開”或“閉合”狀態兩類,通過刪除構建模型不需要的圖像來手動清理數據。
數據包括大約7000張在不同光照條件下的人眼圖像。在數據集上訓練模型后,我們附加了最終權重和模型結構文件“models /cnnCat2.h6”。現在,你可以使用此模型按人眼睜開還是閉合對圖像進行分類。
模型結構
我們使用的模型是Keras通過卷積神經網絡(CNN)構建的。卷積神經網絡是一種特殊類型的深度神經網絡,在圖像分類方面表現非常出色。
CNN基本上由一個輸入層、一個輸出層和一個可以包含多個層的隱藏層組成。通過過濾器在這些層上執行卷積運算,該濾波器在層和過濾器上執行2D矩陣乘法。
CNN模型結構包括以下幾層:
卷積層;32個節點,內核大小為3
卷積層;32個節點,內核大小為3
卷積層;64個節點,內核大小為3
完全連接層;128個節點
最后一層也是具有2個節點的完全連接層。在所有層中,除了使用Softmax的輸出層外,均使用Relu激活函數。
Python項目進行駕駛員疲勞檢測的步驟
從zip下載python項目源代碼并提取系統中的文件:Python項目Zip文件。
zip的目錄為:
1.“haar級聯文件/ cascade files”文件夾包含從圖像中檢測對象所需的xml文件。在本案例中,需要檢測人臉和人眼。
2.模型文件夾包含我們的模型文件“cnnCat2.h6”,該文件是在卷積神經網絡上進行訓練的。
3.我們有一段音頻“alarm.wav”,用于在駕駛員昏昏欲睡時播放。
4.“Model.py”文件包含一個程序,通過該程序對數據集進行訓練來構建分類模型。您可以從此文件中了解卷積神經網絡的執行情況。
5.“Drowsinessdetection.py”是本項目的主要文件。開始檢測時,我們必須要運行此文件。
接下來。讓我們逐步了解該算法是怎么工作的。
第1步-從相機中獲取圖像作為輸入
使用網絡攝像頭獲取圖像作為輸入。為了訪問網絡攝像頭,我們進行了無限循環以捕獲每一幀。我們使用OpenCV提供的方法cv2.VideoCapture(0)來訪問攝像機并設置捕獲對象(cap)。cap.read()將讀取每一幀,并將圖像存儲在幀變量中。
第2步-檢測圖像中的臉部并創建一個感興趣區(ROI)
為了檢測圖像中的人臉,首先需要將圖像模式轉換為灰度,因為用于對象檢測的OpenCV算法需要輸入灰度圖像。因此無需顏色信息即可檢測物體。
我們將使用haar級聯分類器來檢測人臉。通過face =cv2.CascadeClassifier('抵達haar級聯xml文件的路徑')設置分類器,然后使用faces =face.detectMultiScale(gray)執行檢測。進而產生帶有x、y坐標以及高度(對象邊界框的寬度)的檢測數組。現在我們可以迭代這些臉并為每張人臉繪制邊界框。
for (x,y,w,h)in faces:cv2.rectangle(frame,(x,y), (x+w, y+h), (100,100,100), 1 )
第3步-從ROI中檢測人眼并將其輸入分類器
檢測人臉的過程也同樣適用于檢測人眼。
首先,我們分別在leye和reye中為眼睛設置級聯分類器,然后使用left_eye =leye.detectMultiScale(gray)來檢測人眼。現在,我們只需要從完整圖像中提取出人眼數據即可。這可以通過提取眼睛的邊界框來實現,然后可以使用此代碼從幀中提取眼睛圖像。
l_eye =frame[ y : y+h, x : x+w ]
l_eye僅包含左眼的圖像數據。這將被輸入到CNN分類器中,該分類器將預測眼睛是處于睜開還是閉合狀態。同樣,我們將右眼的數據提取到r_eye中。
第4步-分類器將按睜開或閉合對眼睛進行分類。
使用CNN分類器預測眼睛狀態。因為模型需要從正確的維度開始,因此將圖像輸入模型之前需要執行一些操作。
首先,使用r_eye = cv2.cvtColor(r_eye,cv2.COLOR_BGR2GRAY)將彩色圖像轉換為灰度圖像。
然后,由于模型是在24 * 24像素的圖像上測試,需要將圖像也調整為24 * 24像素:
cv2.resize(r_eye,(24,24))。我們將數據標準化以實現更好的收斂性:r_eye = r_eye/ 255(所有值都在0-1之間)。擴展維度以輸入到分類器中。使用model = load_model(‘models / cnnCat2.h6’)來加載模型。
現在我們用模型預測每只眼睛的狀態:lpred =model.predict_classes(l_eye)。如果lpred [0]= 1,則說明眼睛是睜開的;如果lpred [0]= 0,則說明眼睛是閉合的。
第5步-計算分數判斷駕駛員是否處于疲勞狀態
分數基本上是一個值,用于確定駕駛員閉眼的時長。因此,如果雙眼都閉合,得分將不斷增加,而雙眼睜開時,得分將降低。使用cv2.putText()函數在屏幕上繪制結果,該函數將顯示駕駛員的實時狀態。
cv2.putText(frame,“Open”, (10, height-20), font, 1, (255,255,255), 1, cv2.LINE_AA )
閾值由以下方法確定:例如,如果得分大于15意味著該駕駛員閉眼時間較長,則閾值為15。此時,我們將使用sound.play()發出警報。
主要文件的源代碼如下:
import cv2 import os fromkeras.models importload_model import numpy asnp from pygameimport mixer import time mixer.init() sound =mixer.Sound('alarm.wav') face =cv2.CascadeClassifier('haar cascade files\haarcascade_frontalface_alt.xml') leye =cv2.CascadeClassifier('haar cascade files\haarcascade_lefteye_2splits.xml') reye =cv2.CascadeClassifier('haar cascade files\haarcascade_righteye_2splits.xml') lbl=['Close','Open'] model =load_model('models/cnncat2.h6') path =os.getcwd() cap = cv2.VideoCapture(0) font =cv2.FONT_HERSHEY_COMPLEX_SMALL count=0 score=0 thicc=2 rpred=[99] lpred=[99]
while(True): ret, frame = cap.read() height,width = frame.shape[:2] gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) faces =face.detectMultiScale(gray,minNeighbors=5,scaleFactor=1.1,minSize=(25,25)) left_eye = leye.detectMultiScale(gray) right_eye = reye.detectMultiScale(gray) cv2.rectangle(frame, (0,height-50) ,(200,height) , (0,0,0) , thickness=cv2.FILLED ) for (x,y,w,h) in faces: cv2.rectangle(frame,(x,y) , (x+w,y+h) , (100,100,100) , 1 ) for (x,y,w,h) in right_eye: r_eye=frame[y:y+h,x:x+w] count=count+1 r_eye =cv2.cvtColor(r_eye,cv2.COLOR_BGR2GRAY) r_eye = cv2.resize(r_eye,(24,24)) r_eye= r_eye/255 r_eye= r_eye.reshape(24,24,-1) r_eye = np.expand_dims(r_eye,axis=0) rpred = model.predict_classes(r_eye) if(rpred[0]==1): lbl='Open' if(rpred[0]==0): lbl='Closed' break for (x,y,w,h) in left_eye: l_eye=frame[y:y+h,x:x+w] count=count+1 l_eye = cv2.cvtColor(l_eye,cv2.COLOR_BGR2GRAY) l_eye = cv2.resize(l_eye,(24,24)) l_eye= l_eye/255 l_eye=l_eye.reshape(24,24,-1) l_eye = np.expand_dims(l_eye,axis=0) lpred = model.predict_classes(l_eye) if(lpred[0]==1): lbl='Open' if(lpred[0]==0): lbl='Closed' break if(rpred[0]==0 and lpred[0]==0): score=score+1 cv2.putText(frame,"Closed",(10,height-20), font,1,(255,255,255),1,cv2.LINE_AA) # if(rpred[0]==1 or lpred[0]==1): else: score=score-1 cv2.putText(frame,"Open",(10,height-20), font,1,(255,255,255),1,cv2.LINE_AA) if(score<0): score=0 cv2.putText(frame,'Score:'+str(score),(100,height-20), font,1,(255,255,255),1,cv2.LINE_AA) if(score>15): #person is feeling sleepy so we beepthe alarm cv2.imwrite(os.path.join(path,'image.jpg'),frame) try: sound.play() except: # isplaying = False pass if(thicc<16): thicc= thicc+2 else: thicc=thicc-2 if(thicc<2): thicc=2 cv2.rectangle(frame,(0,0),(width,height),(0,0,255),thicc) cv2.imshow('frame',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
Python項目示例
開始項目,查看項目運作情況。要啟動該項目,需要打開命令提示符,轉到主文件“ drowsinessdetection.py”所在的目錄。使用如下命令運行腳本。
python“drowsiness detection.py”
可能需要幾秒鐘來打開網絡攝像頭并開始檢測。
示例截圖:
感謝各位的閱讀,以上就是“怎么用Python實現駕駛員疲勞檢測”的內容了,經過本文的學習后,相信大家對怎么用Python實現駕駛員疲勞檢測這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。