日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
史上很強(qiáng)副駕駛——開車打瞌睡?Python叫醒你

本文轉(zhuǎn)載自公眾號(hào)“讀芯術(shù)”(ID:AI_Discovery)

創(chuàng)新互聯(lián)建站主要從事成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)陽江,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

道路千萬條,安全第一條!疲勞駕駛可謂交通事故幾大罪魁禍?zhǔn)字唬鶕?jù)美國(guó)一項(xiàng)研究顯示,司機(jī)睡眠不足4小時(shí),交通事故肇事幾率等同于醉駕。

為了減少疲勞駕駛現(xiàn)象,駕駛員疲勞檢測(cè)應(yīng)運(yùn)而生。這是一項(xiàng)安全技術(shù),可以預(yù)防駕駛員在駕駛過程中因疲勞而導(dǎo)致的安全事故。

該P(yáng)ython中級(jí)項(xiàng)目的目的是建立一個(gè)駕駛員疲勞檢測(cè)系統(tǒng),用于檢測(cè)人眼閉合時(shí)長(zhǎng)。當(dāng)檢測(cè)到駕駛員疲勞駕駛時(shí),該系統(tǒng)將發(fā)出警告。

駕駛員疲勞檢測(cè)系統(tǒng)

本Python項(xiàng)目將使用OpenCV收集來自網(wǎng)絡(luò)攝像頭的圖像,將其輸入到“深度學(xué)習(xí)”模型中,由該模型對(duì)人眼按“睜開”或“閉合”進(jìn)行分類。該P(yáng)ython項(xiàng)目將采取的方法如下:

第1步-從相機(jī)中獲取圖像作為輸入。

第2步-檢測(cè)圖像中的臉部并創(chuàng)建一個(gè)感興趣區(qū)(ROI)。

第3步-從ROI中檢測(cè)人眼并將其輸入分類器。

第4步-分類器將按睜開或閉合對(duì)人眼進(jìn)行分類。

第5步-計(jì)算分?jǐn)?shù)判斷駕駛員是否處于疲勞狀態(tài)。

在學(xué)習(xí)先決條件、數(shù)據(jù)集和模型結(jié)構(gòu)前,如果您是新手,建議您參考Python MasterSheet先了解Python編程語言所需的一切概念。

先決條件

該P(yáng)ython項(xiàng)目需要一個(gè)網(wǎng)絡(luò)攝像頭,用于捕獲圖像。您需要在系統(tǒng)上安裝Python(建議使用3.6版),然后使用pip安裝所需的軟件包。

  • OpenCV – 使用pip安裝opencv-python(面部和眼部檢測(cè))。
  • TensorFlow – 使用pip安裝tensorflow(keras使用TensorFlow作為后端)。
  • Keras – 使用pip安裝keras(建立分類模型)。
  • Pygame – 使用pip安裝pygame(播放警告提示音)。

數(shù)據(jù)集

需要?jiǎng)?chuàng)建用于此模型的數(shù)據(jù)集。為創(chuàng)建數(shù)據(jù)集,我們編寫了一個(gè)腳本來捕獲攝像機(jī)中的人眼圖像并將其存儲(chǔ)在本地磁盤中,將人眼圖像分為“睜開”或“閉合”狀態(tài)兩類,通過刪除構(gòu)建模型不需要的圖像來手動(dòng)清理數(shù)據(jù)。

數(shù)據(jù)包括大約7000張?jiān)诓煌庹諚l件下的人眼圖像。在數(shù)據(jù)集上訓(xùn)練模型后,我們附加了最終權(quán)重和模型結(jié)構(gòu)文件“models /cnnCat2.h5”。現(xiàn)在,你可以使用此模型按人眼睜開還是閉合對(duì)圖像進(jìn)行分類。

模型結(jié)構(gòu)

我們使用的模型是Keras通過卷積神經(jīng)網(wǎng)絡(luò)(CNN)構(gòu)建的。卷積神經(jīng)網(wǎng)絡(luò)是一種特殊類型的深度神經(jīng)網(wǎng)絡(luò),在圖像分類方面表現(xiàn)非常出色。

CNN基本上由一個(gè)輸入層、一個(gè)輸出層和一個(gè)可以包含多個(gè)層的隱藏層組成。通過過濾器在這些層上執(zhí)行卷積運(yùn)算,該濾波器在層和過濾器上執(zhí)行2D矩陣乘法。

CNN模型結(jié)構(gòu)包括以下幾層:

  • 卷積層;32個(gè)節(jié)點(diǎn),內(nèi)核大小為3
  • 卷積層;32個(gè)節(jié)點(diǎn),內(nèi)核大小為3
  • 卷積層;64個(gè)節(jié)點(diǎn),內(nèi)核大小為3
  • 完全連接層;128個(gè)節(jié)點(diǎn)

最后一層也是具有2個(gè)節(jié)點(diǎn)的完全連接層。在所有層中,除了使用Softmax的輸出層外,均使用Relu激活函數(shù)。

Python項(xiàng)目進(jìn)行駕駛員疲勞檢測(cè)的步驟

從zip下載python項(xiàng)目源代碼并提取系統(tǒng)中的文件:Python項(xiàng)目Zip文件。

zip的目錄為:

1.“haar級(jí)聯(lián)文件/ cascade files”文件夾包含從圖像中檢測(cè)對(duì)象所需的xml文件。在本案例中,需要檢測(cè)人臉和人眼。

2.模型文件夾包含我們的模型文件“cnnCat2.h5”,該文件是在卷積神經(jīng)網(wǎng)絡(luò)上進(jìn)行訓(xùn)練的。

3.我們有一段音頻“alarm.wav”,用于在駕駛員昏昏欲睡時(shí)播放。

4.“Model.py”文件包含一個(gè)程序,通過該程序?qū)?shù)據(jù)集進(jìn)行訓(xùn)練來構(gòu)建分類模型。您可以從此文件中了解卷積神經(jīng)網(wǎng)絡(luò)的執(zhí)行情況。

5.“Drowsinessdetection.py”是本項(xiàng)目的主要文件。開始檢測(cè)時(shí),我們必須要運(yùn)行此文件。

接下來。讓我們逐步了解該算法是怎么工作的。

第1步-從相機(jī)中獲取圖像作為輸入

使用網(wǎng)絡(luò)攝像頭獲取圖像作為輸入。為了訪問網(wǎng)絡(luò)攝像頭,我們進(jìn)行了無限循環(huán)以捕獲每一幀。我們使用OpenCV提供的方法cv2.VideoCapture(0)來訪問攝像機(jī)并設(shè)置捕獲對(duì)象(cap)。cap.read()將讀取每一幀,并將圖像存儲(chǔ)在幀變量中。

第2步-檢測(cè)圖像中的臉部并創(chuàng)建一個(gè)感興趣區(qū)(ROI)

為了檢測(cè)圖像中的人臉,首先需要將圖像模式轉(zhuǎn)換為灰度,因?yàn)橛糜趯?duì)象檢測(cè)的OpenCV算法需要輸入灰度圖像。因此無需顏色信息即可檢測(cè)物體。

我們將使用haar級(jí)聯(lián)分類器來檢測(cè)人臉。通過face =cv2.CascadeClassifier('抵達(dá)haar級(jí)聯(lián)xml文件的路徑')設(shè)置分類器,然后使用faces =face.detectMultiScale(gray)執(zhí)行檢測(cè)。進(jìn)而產(chǎn)生帶有x、y坐標(biāo)以及高度(對(duì)象邊界框的寬度)的檢測(cè)數(shù)組?,F(xiàn)在我們可以迭代這些臉并為每張人臉繪制邊界框。

 
 
 
 
  1. for (x,y,w,h)in faces:cv2.rectangle(frame,(x,y), (x+w, y+h), (100,100,100), 1 ) 

第3步-從ROI中檢測(cè)人眼并將其輸入分類器

檢測(cè)人臉的過程也同樣適用于檢測(cè)人眼。

首先,我們分別在leye和reye中為眼睛設(shè)置級(jí)聯(lián)分類器,然后使用left_eye =leye.detectMultiScale(gray)來檢測(cè)人眼?,F(xiàn)在,我們只需要從完整圖像中提取出人眼數(shù)據(jù)即可。這可以通過提取眼睛的邊界框來實(shí)現(xiàn),然后可以使用此代碼從幀中提取眼睛圖像。

 
 
 
 
  1. l_eye =frame[ y : y+h, x : x+w ] 

l_eye僅包含左眼的圖像數(shù)據(jù)。這將被輸入到CNN分類器中,該分類器將預(yù)測(cè)眼睛是處于睜開還是閉合狀態(tài)。同樣,我們將右眼的數(shù)據(jù)提取到r_eye中。

第4步-分類器將按睜開或閉合對(duì)眼睛進(jìn)行分類。

使用CNN分類器預(yù)測(cè)眼睛狀態(tài)。因?yàn)槟P托枰獜恼_的維度開始,因此將圖像輸入模型之前需要執(zhí)行一些操作。

首先,使用r_eye = cv2.cvtColor(r_eye,cv2.COLOR_BGR2GRAY)將彩色圖像轉(zhuǎn)換為灰度圖像。

然后,由于模型是在24 * 24像素的圖像上測(cè)試,需要將圖像也調(diào)整為24 * 24像素:

cv2.resize(r_eye,(24,24))。我們將數(shù)據(jù)標(biāo)準(zhǔn)化以實(shí)現(xiàn)更好的收斂性:r_eye = r_eye/ 255(所有值都在0-1之間)。擴(kuò)展維度以輸入到分類器中。使用model = load_model(‘models / cnnCat2.h5’)來加載模型。

現(xiàn)在我們用模型預(yù)測(cè)每只眼睛的狀態(tài):lpred =model.predict_classes(l_eye)。如果lpred [0]= 1,則說明眼睛是睜開的;如果lpred [0]= 0,則說明眼睛是閉合的。

第5步-計(jì)算分?jǐn)?shù)判斷駕駛員是否處于疲勞狀態(tài)

分?jǐn)?shù)基本上是一個(gè)值,用于確定駕駛員閉眼的時(shí)長(zhǎng)。因此,如果雙眼都閉合,得分將不斷增加,而雙眼睜開時(shí),得分將降低。使用cv2.putText()函數(shù)在屏幕上繪制結(jié)果,該函數(shù)將顯示駕駛員的實(shí)時(shí)狀態(tài)。

 
 
 
 
  1. cv2.putText(frame,“Open”, (10, height-20), font, 1, (255,255,255), 1, cv2.LINE_AA ) 

閾值由以下方法確定:例如,如果得分大于15意味著該駕駛員閉眼時(shí)間較長(zhǎng),則閾值為15。此時(shí),我們將使用sound.play()發(fā)出警報(bào)。

主要文件的源代碼如下:

 
 
 
 
  1. import cv2 
  2. import os 
  3. fromkeras.models 
  4. importload_model 
  5. import numpy asnp 
  6. from pygameimport mixer 
  7. import time 
  8. mixer.init() 
  9. sound =mixer.Sound('alarm.wav') 
  10. face =cv2.CascadeClassifier('haar cascade files\haarcascade_frontalface_alt.xml') 
  11. leye =cv2.CascadeClassifier('haar cascade files\haarcascade_lefteye_2splits.xml') 
  12. reye =cv2.CascadeClassifier('haar cascade files\haarcascade_righteye_2splits.xml') 
  13. lbl=['Close','Open'] 
  14. model =load_model('models/cnncat2.h5') 
  15. path =os.getcwd() 
  16. cap = cv2.VideoCapture(0) 
  17. font =cv2.FONT_HERSHEY_COMPLEX_SMALL 
  18. count=0 
  19. score=0 
  20. thicc=2 
  21. rpred=[99] 
  22. lpred=[99] 

 
 
 
 
  1. while(True): 
  2.     ret, frame = cap.read() 
  3.     height,width = frame.shape[:2] 
  4.     gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) 
  5.     faces =face.detectMultiScale(gray,minNeighbors=5,scaleFactor=1.1,minSize=(25,25)) 
  6.     left_eye = leye.detectMultiScale(gray) 
  7.     right_eye = reye.detectMultiScale(gray) 
  8.     cv2.rectangle(frame, (0,height-50) ,(200,height) , (0,0,0) , thickness=cv2.FILLED ) 
  9.     for (x,y,w,h) in faces: 
  10. cv2.rectangle(frame,(x,y) , (x+w,y+h) , (100,100,100) , 1 ) 
  11.     for (x,y,w,h) in right_eye: 
  12.         r_eye=frame[y:y+h,x:x+w] 
  13.         count=count+1 
  14.         r_eye =cv2.cvtColor(r_eye,cv2.COLOR_BGR2GRAY) 
  15.         r_eye = cv2.resize(r_eye,(24,24)) 
  16.         r_eye= r_eye/255 
  17.         r_eye= r_eye.reshape(24,24,-1) 
  18.         r_eye = np.expand_dims(r_eye,axis=0) 
  19.         rpred = model.predict_classes(r_eye) 
  20.         if(rpred[0]==1): 
  21.             lbl='Open' 
  22.         if(rpred[0]==0): 
  23.             lbl='Closed' 
  24.         break 
  25.     for (x,y,w,h) in left_eye: 
  26.         l_eye=frame[y:y+h,x:x+w] 
  27.         count=count+1 
  28.         l_eye = cv2.cvtColor(l_eye,cv2.COLOR_BGR2GRAY) 
  29.         l_eye = cv2.resize(l_eye,(24,24)) 
  30.         l_eye= l_eye/255 
  31.         l_eye=l_eye.reshape(24,24,-1) 
  32.         l_eye = np.expand_dims(l_eye,axis=0) 
  33.         lpred = model.predict_classes(l_eye) 
  34.         if(lpred[0]==1): 
  35.             lbl='Open' 
  36.         if(lpred[0]==0): 
  37.             lbl='Closed' 
  38.         break 
  39.     if(rpred[0]==0 and lpred[0]==0): 
  40.         score=score+1 
  41.        cv2.putText(frame,"Closed",(10,height-20), font,1,(255,255,255),1,cv2.LINE_AA) 
  42.     # if(rpred[0]==1 or lpred[0]==1): 
  43.     else: 
  44.         score=score-1 
  45.        cv2.putText(frame,"Open",(10,height-20), font,1,(255,255,255),1,cv2.LINE_AA) 
  46.     if(score<0): 
  47.         score=0 
  48.    cv2.putText(frame,'Score:'+str(score),(100,height-20), font,1,(255,255,255),1,cv2.LINE_AA) 
  49.     if(score>15): 
  50.         #person is feeling sleepy so we beepthe alarm 
  51.        cv2.imwrite(os.path.join(path,'image.jpg'),frame) 
  52.         try: 
  53.             sound.play() 
  54.         except: # isplaying = False 
  55.             pass 
  56.         if(thicc<16): 
  57.             thicc= thicc+2 
  58.         else: 
  59.             thicc=thicc-2 
  60.             if(thicc<2): 
  61.                 thicc=2 
  62.        cv2.rectangle(frame,(0,0),(width,height),(0,0,255),thicc) 
  63.     cv2.imshow('frame',frame) 
  64.     if cv2.waitKey(1) & 0xFF == ord('q'): 
  65.         break 
  66. cap.release() 
  67. cv2.destroyAllWindows() 

Python項(xiàng)目示例

開始項(xiàng)目,查看項(xiàng)目運(yùn)作情況。要啟動(dòng)該項(xiàng)目,需要打開命令提示符,轉(zhuǎn)到主文件“ drowsinessdetection.py”所在的目錄。使用如下命令運(yùn)行腳本。

 
 
 
 
  1. python“drowsiness detection.py” 

可能需要幾秒鐘來打開網(wǎng)絡(luò)攝像頭并開始檢測(cè)。

示例截圖:

輸出截圖:

1.閉眼檢測(cè)

2. 睜眼檢測(cè)

3. 疲勞警告

此Python項(xiàng)目構(gòu)建了一個(gè)駕駛員疲勞警報(bào)系統(tǒng),你可以通過多種方式實(shí)施該系統(tǒng)。我們通過Haar級(jí)聯(lián)分類器,使用OpenCV檢測(cè)人臉和人眼,然后根據(jù)CNN模型預(yù)測(cè)狀態(tài)。

規(guī)范駕駛哪家強(qiáng)?Python安全員幫你忙。為了自己和他人的生命安全,請(qǐng)不要疲勞駕駛!


分享文章:史上很強(qiáng)副駕駛——開車打瞌睡?Python叫醒你
標(biāo)題網(wǎng)址:http://m.5511xx.com/article/dhhhsip.html